Regex 使用点匹配所有模式的正则表达式
通常情况下,不匹配换行符,除非我使用(?s)标志指定引擎来匹配换行符。我在编辑器(UltraEdit v14.10)的regexp引擎上使用Perl风格的regexp模式尝试了这个regexp:Regex 使用点匹配所有模式的正则表达式,regex,multiline,ultraedit,Regex,Multiline,Ultraedit,通常情况下,不匹配换行符,除非我使用(?s)标志指定引擎来匹配换行符。我在编辑器(UltraEdit v14.10)的regexp引擎上使用Perl风格的regexp模式尝试了这个regexp: (?s).*i 搜索文本包含多行,每行包含许多“i”字符 我希望上面的regexp意味着:搜索尽可能多的字符(因为使用“”s”现在匹配任何字符,包括换行符)(因为对*)的贪婪),直到到达字符“I” 这应该意味着“从第一个字符到最后一句话中的最后一个‘我’”(贪婪应该达到最后一句,对吧?) 但在Ultr
(?s).*i
搜索文本包含多行,每行包含许多“i”字符
我希望上面的regexp意味着:搜索尽可能多的字符(因为使用“”s”现在匹配任何字符,包括换行符)(因为对*)的贪婪),直到到达字符“I”
这应该意味着“从第一个字符到最后一句话中的最后一个‘我’”(贪婪应该达到最后一句,对吧?)
但在UltraEdit的测试中,结果是“从第一个包含i的句子中的第一个字符到最后一个‘i’”。这个结果正确吗?我对我的reg表达式有任何错误的解释吗
e、 g.鉴于本文
aaa
bbb
aiaiaiaiaa
bbbicicid
是的
aaa
bbb
aiaiaiai
匹配。但我希望:
aaa
bbb
aiaiaiaiaa
bbbicici
您的正则表达式是正确的,您对其性能的期望也是正确的 这是UltraEdit的正则表达式实现中的一个众所周知的bug,我已经多次编写该实现来支持它。据我所知,它还没有修好。问题似乎在于UE的regex实现基本上是基于行的,并且只有在必要时才会在匹配中加入额外的行。因此,
*
将在当前行上进行贪婪的匹配,但如果不需要通过换行边界来实现匹配,则不会跨越换行边界
还有其他一些带有行尾的细微缺陷。例如,lookback也不能跨换行符工作
写入IDM支持,或更改为具有良好正则表达式支持的编辑器。我两个都做了。是的,你是对的,这看起来像个bug 你的解释是正确的。如果您处于Perl模式而不是Posix。 但是,它也应该适用于posix 尽管像您这样定义修饰符是非常罕见的 大多数情况下,您会提供一个带有分隔符的字符串,以及后面的修饰符,如
/.*i/s
但这并不重要,因为你的方式也是正确的。如果它不被支持,它也不会匹配第一个换行符
是的,这肯定是程序中的一个bug。您认为正则表达式应该匹配整个字符串(全部4行)是正确的。我的猜测是UltraEdit试图通过逐行工作来进行某种优化,并且只在“必要时”积累新的行。如果这不是一个bug,我猜这就是他们将行为更改为这种方式的原因。也许,对于一个文本编辑器来说,贪婪地搜索整个文件会产生太糟糕的性能。我不知道你提到的lookback bug。但是,贪婪地搜索整个输入文件会不会太慢,以至于他们决定以这种方式改变行为?请记住,UltraEdit允许编辑大小为MBs的输入文件。EditPadPro处理大小为GBs的文件,并且没有这些正则表达式限制。如果我构造一个贪婪的正则表达式,我希望它能正常工作。如果这意味着内存不足,那么这是我或操作系统的问题,但编辑不应该猜测我。