Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex的“贪婪”是如何运作的_Regex - Fatal编程技术网

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,正则表达式。*只要整个模式匹配,就贪婪地匹配。