我试图理解为什么我的示例正则表达式不按照我想要的方式工作:
test-text: Filename: test myFile 123 .txt
pattern: (?<=Filename:.*?myFile)(.*?)(?=.txt)
Expected Result: 123
我知道前瞻/后方在这里并不理想,但这只是为了学习目的而试图理解。
那么为什么.*?myFile
不起作用?如果我将其删除,则模式与test myFile 123
匹配。但是我想查找Filename:
,然后排除myFile
之前的所有内容,并在最后.txt
语句之后删除所有内容。我在这里缺少什么?
答案 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。
编辑:关于你的错误:可能你的正则表达式引擎不支持可变长度的环视。