Regex 非贪婪正则表达式与我期望的不匹配
我在文本中搜索使用“variable2”的行,该行前面没有分号。这是我的正则表达式来解决这个问题Regex 非贪婪正则表达式与我期望的不匹配,regex,non-greedy,Regex,Non Greedy,我在文本中搜索使用“variable2”的行,该行前面没有分号。这是我的正则表达式来解决这个问题 ^[^;]*?变量2 我对这一点的理解是,它应该找到以换行符开头的文本,该换行符将后跟“variable2”的非分号字符的数量减到最少。 这无法选择我在本例中期望的内容 Label0: mov variable0,WREG ;Some comment mov W0,variable1 Label1: btsc variable2,#1
^[^;]*?变量2
我对这一点的理解是,它应该找到以换行符开头的文本,该换行符将后跟“variable2”的非分号字符的数量减到最少。
这无法选择我在本例中期望的内容
Label0: mov variable0,WREG ;Some comment
mov W0,variable1
Label1: btsc variable2,#1 ;Some other comment
bra label2
我希望能得到这个
Label1: btsc variable2
而是选择了这个
mov W0,variable1
Label1: btsc variable2
我误解了什么?在我看来,非贪婪的表达方式并没有达到我的目的。如果我将正则表达式更改为
^[^;\n]*?variable2
,它将选择我希望它选择的内容。我在正则表达式中使用升华文本2,但在php、javascript和python中似乎得到了相同的结果(根据regex101.com)。^[^;]*?variable2
此正则表达式匹配除之外的任何内容代码>从行的开始到variable2
。因为第2行和第3行(只是换行)也不包含任何代码>从第二行开始到variable2
之间匹配。由于您使用的是多行模式,^
充当每行的锚点
^[^;\n]*?变量2
此正则表达式匹配除之外的任何内容代码>和\n
从行首到变量2。第2行和第3行不匹配,因为它们包含\n
这里有一个关键的惰性匹配错误点:它不试图找到整体上最短的匹配,但它试图从一开始就找到最短的匹配。让我们用一个短得多的正则表达式来显示:<代码> A*B.<代码>。给定一个字符串aab
,您希望惰性匹配匹配ab
,但它匹配aab
正则表达式解析器从字符串中的第一个字符(第一个a
)开始,并与之匹配。然后继续,但无法匹配b
,因为第二个字符仍然是a
。然后,它扩展a*?
模式以匹配aa
,现在可以成功匹配b
,给出整体匹配aab
,您可以使用负前瞻:
^(?:(?!;).)+variable2
请参见(请注意多行
修改器!)
是的,我认为它会积极寻找一组较短的字符来匹配。我一直称之为非贪婪,但懒惰是一个更具描述性的词。
^ # matches the beginning of the line
(?:(?!;).)+ # match any character except a newline
# and make sure what immediately follows
# is not a semicolon
variable2 # match variable2