Regex的“贪婪”是如何运作的
下面是一个非常简单的正则表达式:-Regex的“贪婪”是如何运作的,regex,Regex,下面是一个非常简单的正则表达式:- kabk k(.*)k result: kabk has 1 group: ab 我通常是这样做的,这是正确的,但不必要的 k([^k]*)k 有人能给我解释一下正则表达式解析器是如何工作的吗?是的,.*运算符应该消耗尽可能多的字符。是的,*运算符是,并且将捕获尽可能多的有效字符 例如,应用于kkak的模式k.*k将捕获kkka 您可以使操作符不贪婪地使用?接线员 因此,应用于kkkak的模式k.*k将不捕获任何内容,因为最小的非贪婪匹配是在前两个k字符之
kabk
k(.*)k
result:
kabk has 1 group:
ab
我通常是这样做的,这是正确的,但不必要的
k([^k]*)k
有人能给我解释一下正则表达式解析器是如何工作的吗?是的,.*运算符应该消耗尽可能多的字符。是的,*运算符是,并且将捕获尽可能多的有效字符
例如,应用于kkak的模式k.*k将捕获kkka
您可以使操作符不贪婪地使用?接线员
因此,应用于kkkak的模式k.*k将不捕获任何内容,因为最小的非贪婪匹配是在前两个k字符之间不允许任何内容
作为对您评论的回复,模式中最后一个k的存在意味着它需要尽可能多地保留,以便在尽可能多地消耗后仍与k匹配。是的,*运算符是,并且将捕获尽可能多的有效字符
例如,应用于kkak的模式k.*k将捕获kkka
您可以使操作符不贪婪地使用?接线员
因此,应用于kkkak的模式k.*k将不捕获任何内容,因为最小的非贪婪匹配是在前两个k字符之间不允许任何内容
作为对您评论的回复,模式中最后一个k的存在意味着在消耗尽可能多的k之后,它需要尽可能多地离开以与k匹配。在kabk中,只有两个k。所以,这不是学习贪婪匹配的合适例子
让我们用不同的例子来试试:kabkxyk
贪婪版本匹配返回kabkxyk.*在最后一个k:Followng之前前进是javascript:
'kabkxyk'.match(/k.*k/)
// ["kabkxyk"]
当非贪婪版本匹配返回kabk时:
在卡布,只有两个卡布。所以,这不是学习贪婪匹配的合适例子
让我们用不同的例子来试试:kabkxyk
贪婪版本匹配返回kabkxyk.*在最后一个k:Followng之前前进是javascript:
'kabkxyk'.match(/k.*k/)
// ["kabkxyk"]
当非贪婪版本匹配返回kabk时:
是的,*是贪婪的。它尽可能地匹配
*?不贪婪,或吝啬。它尽可能少地匹配
如果你将香蕉与ba.*a匹配,它将与香蕉匹配
如果你将香蕉与ba.*a相匹配,它将与bana相匹配。是的,*是贪婪的。它尽可能地匹配
*?不贪婪,或吝啬。它尽可能少地匹配
如果你将香蕉与ba.*a匹配,它将与香蕉匹配
如果您将香蕉与ba.*?a匹配,它将与bana匹配。让我们先在regex101.com调试器上查看k[^k]*k使用否定匹配:
1 /k([^k]*)k/ kabk
2 /k([^k]*)k/ kabk
3 /k([^k]*)k/ kabk
4 /k([^k]*)k/ kabk
5 /k([^k]*)k/ kabk
6 /k([^k]*)k/ kabk
7 /k([^k]*)k/ kabk
# Match found in 7 steps.
现在让我们在同一个regex101.com调试器上使用geedy match查看k.*k匹配:
1 /k(.*)k/ kabk
2 /k(.*)k/ kabk
3 /k(.*)k/ kabk
4 /k(.*)k/ kabk
5 /k(.*)k/ kabk
6 /k(.*)k/ kabk BACKTRACK
7 /k(.*)k/ kabk BACKTRACK
8 /k(.*)k/ kabk
9 /k(.*)k/ kabk
# Match found in 9 steps.
显然,第一个正则表达式在较长的字符串中效率更高,因为它不涉及回溯。让我们在regex101.com调试器上先查看k[^k]*k使用否定匹配:
1 /k([^k]*)k/ kabk
2 /k([^k]*)k/ kabk
3 /k([^k]*)k/ kabk
4 /k([^k]*)k/ kabk
5 /k([^k]*)k/ kabk
6 /k([^k]*)k/ kabk
7 /k([^k]*)k/ kabk
# Match found in 7 steps.
现在让我们在同一个regex101.com调试器上使用geedy match查看k.*k匹配:
1 /k(.*)k/ kabk
2 /k(.*)k/ kabk
3 /k(.*)k/ kabk
4 /k(.*)k/ kabk
5 /k(.*)k/ kabk
6 /k(.*)k/ kabk BACKTRACK
7 /k(.*)k/ kabk BACKTRACK
8 /k(.*)k/ kabk
9 /k(.*)k/ kabk
# Match found in 9 steps.
显然,第一个正则表达式在更长的字符串中效率更高,因为不涉及回溯。可能重复的可能重复的感谢。如果把贪婪放在一边,为什么不呢。*在我的示例中,使用第一个“k”之后的所有字符,但没有找到匹配项。@leon,正则表达式。*只要整个模式匹配,就贪婪地匹配。谢谢。如果把贪婪放在一边,为什么不呢。*在我的示例中,使用第一个“k”之后的所有字符,但没有找到匹配项。@leon,正则表达式。*只要整个模式匹配,就贪婪地匹配。