通常。与换行符不匹配,除非我使用(?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
答案 0 :(得分:5)
你的正则表达式是正确的,你对它的表现的期望也是如此。
这是UltraEdit的正则表达式实现中一个众所周知的错误,我已经多次写这篇文章来支持。据我所知,它仍然没有修复。问题似乎在于UE的正则表达式实现基本上是基于行的,并且仅在必要时才将其他行引入匹配。因此.*
将在当前行上贪婪地匹配,但如果不必为了实现匹配,它将不会越过换行边界。
还有一些其他微妙的错误与行结尾。例如,lookbehind也不适用于新行。
写入IDM支持,或更改为具有正确的正则表达式支持的编辑器。我做了两件事。
答案 1 :(得分:1)
是的,你说得对,这看起来像个错误。
您的解释是正确的。如果您处于Perl模式而不是Posix。 但它也应该适用于posix。
像你一样定义修饰符是非常罕见的。
大多数时候你提供了一个带分隔符的字符串和后面的修饰符/.*i/s
但这并不重要,因为你的方式也是正确的。如果它不受支持,它也不会与第一个换行符匹配。
所以是的,这肯定是你程序中的一个错误。
答案 2 :(得分:1)
你是正确的,正则表达式应该匹配整个字符串(所有4行)。我的猜测是UltraEdit试图通过逐行工作来进行某种优化,并且只在“必要时”累积新行。