Regex 非贪婪正则表达式与我期望的不匹配

Regex 非贪婪正则表达式与我期望的不匹配,regex,non-greedy,Regex,Non Greedy,我在文本中搜索使用“variable2”的行,该行前面没有分号。这是我的正则表达式来解决这个问题 ^[^;]*?变量2 我对这一点的理解是,它应该找到以换行符开头的文本,该换行符将后跟“variable2”的非分号字符的数量减到最少。 这无法选择我在本例中期望的内容 Label0: mov variable0,WREG ;Some comment mov W0,variable1 Label1: btsc variable2,#1

我在文本中搜索使用“variable2”的行,该行前面没有分号。这是我的正则表达式来解决这个问题


^[^;]*?变量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