Regex 如何排除边界之间的文本?

Regex 如何排除边界之间的文本?,regex,Regex,我试图理解为什么我的示例正则表达式不能以我希望的方式工作: test-text: Filename: test myFile 123 .txt pattern: (?<=Filename:.*?myFile)(.*?)(?=.txt) Expected Result: 123 测试文本:文件名:test myFile 123.txt 模式:(?Lookbehind断言必须具有固定长度。但是您的*?myFile不具有固定长度 根据您使用的语言,您可以: (?为什么这么复杂 /myFile(

我试图理解为什么我的示例正则表达式不能以我希望的方式工作:

test-text: Filename: test myFile 123 .txt
pattern: (?<=Filename:.*?myFile)(.*?)(?=.txt)
Expected Result: 123
测试文本:文件名:test myFile 123.txt

模式:(?Lookbehind断言必须具有固定长度。但是您的
*?myFile
不具有固定长度

根据您使用的语言,您可以:

(?为什么这么复杂

/myFile(.*?)\.txt$/
只要抓住你感兴趣的那群人就行了。在我看来,没必要四处张望


编辑:至于你的错误是什么:可能你的正则表达式引擎不支持可变长度查找。

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

有一个类似的功能允许这样做:
\K
丢弃最后匹配左侧的所有内容。因此此模式可能会按照您的预期工作:

/Filename:.*?myFile\K(.*?)(?=.txt)/
但是,它与真正的lookback不同,因为它不允许重叠匹配


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

虽然这可能是正确的,但我认为问题在于他的正则表达式到底有什么问题。为什么前瞻中的非贪婪运算符不起作用?(?:Filename:.*myFile)(.*txt)非捕获组?:非?=根据正则表达式的风格,可能不支持可变长度lookbehinds。虽然您的答案正确,但仍会留下前导空格和尾随空格。您可能还希望包括这些空格。
Filename:*.myFile\s*\K.*(?=\s*.txt)
@AshwinMukhija,是的,这是真的,但这更多的是一个技术问题,而不是实际的正则表达式匹配问题。这是真的,但包含完全正确的模式仍然很有用。:)这在我的情况下非常有用!Perl 6和.NET中允许可变长度查找