使用点匹配 - 所有模式的正则表达式

时间:2010-12-03 17:49:51

标签: regex multiline ultraedit

通常与换行符不匹配,除非我使用(?s )标志指定引擎。我使用Perl样式的regexp模式在我的编辑器(UltraEdit v14.10)regexp引擎上尝试了这个regexp:

(?s).*i

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

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

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

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

e.g。给出了这个文本

aaa
bbb
aiaiaiaiaa  
bbbicicid

它是

aaa
bbb
aiaiaiai

匹配。但我希望:

aaa
bbb
aiaiaiaiaa  
bbbicici

3 个答案:

答案 0 :(得分:5)

你的正则表达式是正确的,你对它的表现的期望也是如此。

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

还有一些其他微妙的错误与行结尾。例如,lookbehind也不适用于新行。

写入IDM支持,或更改为具有正确的正则表达式支持的编辑器。我做了两件事。

答案 1 :(得分:1)

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

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

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

大多数时候你提供了一个带分隔符的字符串和后面的修饰符/.*i/s

但这并不重要,因为你的方式也是正确的。如果它不受支持,它也不会与第一个换行符匹配。

所以是的,这肯定是你程序中的一个错误。

答案 2 :(得分:1)

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