1

我试图理解为什么我的示例正则表达式不能按我想要的方式工作:

test-text: Filename: test myFile 123 .txt
pattern: (?<=Filename:.*?myFile)(.*?)(?=.txt)
Expected Result: 123

我知道向前/向后在这里并不理想,但这只是为了学习目的,试图理解。

那么为什么不起作用.*?myFile呢?如果我删除它,模式匹配test myFile 123. 但我想查找Filename:,然后排除所有内容,并在最后一个语句myFile之后和之后获取所有内容。.txt我在这里想念什么?

4

3 回答 3

1

由于正则表达式匹配的复杂性,不支持可变长度的lookbehind 模式。您应该会收到一条错误消息。这只是 Perl 正则表达式引擎的一个限制。

有一个类似的功能允许这样做:\K丢弃最后匹配左侧的所有内容。所以这个模式可能会像你期望的那样工作:

/Filename:.*?myFile\K(.*?)(?=.txt)/

然而,它与真正的lookbehind 不同,因为它不允许重叠匹配。

顺便说一句,这是您发布的第三个类似问题。根据您提供的信息,正确答案仍然是“不要为此使用环视”。如果您有理由要使用它们,您应该解释一下,以便我们可以提供更好的帮助。

于 2013-02-20T12:36:14.760 回答
1

Lookbehind 断言必须具有固定长度。但你.*?myFile不是。

取决于您使用的语言,您可以:

"(?<=Filename:)(.*?myFile\s*)([^\s]*?)(?=\s*.txt)"group(2)如果你喜欢向后看和向前看,那就得到吧。

或者

"Filename:.*?myFile\s*([^\s]*)\s*\.txt"并得到group(1)

于 2013-02-20T12:30:59.700 回答
0

为什么这么复杂?

/myFile(.*?)\.txt$/

如果这就是您感兴趣的全部,只需捕获该组即可。无需环顾 IMO。

编辑:至于你的问题:可能你的正则表达式引擎不支持可变长度环视。

于 2013-02-20T12:32:11.857 回答