2

通常情况下. 除非我使用 ( ?s ) 标志指定引擎,否则不匹配换行符。我使用 Perl 风格的正则表达式模式在我的编辑器 (UltraEdit v14.10) 正则表达式引擎上尝试了这个正则表达式:

(?s).*i

搜索文本包含多行,每行包含许多“i”字符。

我希望上面的正则表达式意味着:搜索尽可能多的字符(因为使用' ?s ' .现在匹配包括换行符在内的任何内容)(因为对 * 的贪婪)直到到达字符'i'。

这应该意味着“从最后一句中的第一个字符到最后一个'i' ”(贪婪应该到达最后一句,对吧?)。

但是通过 UltraEdit 的测试,结果是“从第一个包含 i 的句子中的第一个字符到最后一个 'i'”。这个结果正确吗?我对我的 reg 表达式做出了错误的解释吗?

例如给定这个文本

aaa
bbb
aiaiaiaiaa  
bbbicicid

它是

aaa
bbb
aiaiaiai

匹配。但我期望:

aaa
bbb
aiaiaiaiaa  
bbbicici
4

3 回答 3

5

您的正则表达式是正确的,您对其性能的期望也是正确的。

这是 UltraEdit 的正则表达式实现中的一个长期已知的错误,我已经多次编写以支持它。据我所知,它仍然没有被修复。问题似乎在于 UE 的正则表达式实现本质上是基于行的,并且仅在必要时才将其他行纳入匹配中。所以.*会在当前行上贪婪地匹配,但如果它不需要为了实现匹配,它不会越过换行符边界。

还有一些其他带有行尾的细微错误。例如,lookbehind 也不适用于换行符。

写信给 IDM 支持,或者换一个支持正则表达式的编辑器。我都做了。

于 2010-12-03T18:03:54.680 回答
1

是的,你是对的,这看起来像一个错误。

你的解释是正确的。如果您处于 Perl 模式而不是 Posix。但是它也应该适用于posix。

像你这样定义修饰符是非常罕见的。

大多数情况下,您提供一个带有分隔符的字符串,然后提供修饰符,例如/.*i/s

但这没关系,因为你的方式也是正确的。如果它不被支持,它也不会匹配第一个换行符。

所以是的,这绝对是你程序中的一个错误。

于 2010-12-03T18:06:10.360 回答
1

你是对的,那个正则表达式应该匹配整个字符串(所有 4 行)。我的猜测是 UltraEdit 正试图通过逐行工作来进行某种优化,并且仅在“必要时”累积新行。

于 2010-12-03T18:08:22.937 回答