如何在边界之间排除文字?

时间:2013-02-20 12:27:45

标签: regex

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

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

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

那么为什么.*?myFile不起作用?如果我将其删除,则模式与test myFile 123匹配。但是我想查找Filename:,然后排除myFile之前的所有内容,并在最后.txt语句之后删除所有内容。我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:0)

为什么这么复杂?

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

如果您对此感兴趣,请抓住该组。无需环顾IMO。

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