我试图了解以下基本正则表达式模式:
^^^
这就是我的解释:
第一个脱字符号被视为标记行首的锚点。
第二和第三个插入号字符在字面上进行匹配(因为它们既不在字符类中以引起否定,也不在第一个字符中用作锚点)。
因此,据我了解,我希望它能够与行首处的^^
模式匹配。我明白吗?
但是,似乎上述正则表达式匹配文件中的每一行,而不管其内容如何。在启用Regex搜索模式的Sublime Text中搜索文本文件时,会观察到此行为。
我想念什么?如何正确解释正则表达式?
更新:使用bash shell运行以下命令时,我观察到不同的行为:
grep "^^^" foo
其中foo是与上述相同的文本文件。正则表达式将所有包含模式的行匹配^^
到行首。
我现在对为什么两种情况下的结果不同感到困惑,我如何完全理解行为呢?
什么^
匹配将取决于所使用的正则表达式引擎。在许多语言(包括PHP,Python,Javascript和Java)中,^
字符类之外的任何位置始终会匹配字符串的开头。启用多行标志后,它还将与行的开头匹配。Notepad ++的正则表达式使用Boost,其行为相同(除了NP ++中没有多行标志;^
它将始终与行的开头匹配)。
因此,在NP ++中,这里的^^^
意思是:“匹配行首的位置。然后匹配行首的位置。然后匹配行首的位置。”。因此,每行的开始都被匹配。
相比之下,Bash和其他一些实现正则表达式的BRE风格的对象仅在某些情况下才^
视为锚:
- 甲抑扬(“^”)为一个锚作为整个BRE的第一个字符使用时。当用作子表达式的第一个字符时,该实现可以将抑扬符视为锚点。的抑扬应锚定表达(或可选子表达式),以一个字符串的开头; BRE只匹配从字符串的第一个字符开始的序列。例如,BRE“ ^ ab”匹配字符串“ abcdef”中的“ ab”,但不匹配字符串“ cdefab”。BRE“(^ ab)”可能与前一个字符串匹配。便携式BRE必须逃脱子表达式中的前旋抑音符以匹配文字抑扬音。
在这种情况下,第一个^
被解释为与行的开头匹配,而后两个^
s不是模式的第一个字符,因此被解释为与文字^
s匹配,而不是作为行开始锚。
即使给定相同的样式,不同的正则表达式样式也可能具有非常不同的行为。这是其中一种情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句