+为什么*不匹配?

时间:2016-04-02 00:34:06

标签: regex pcre

在以下示例中(通过regex101.com,PCRE模式),我无法弄清楚为什么+量词会找到一个子字符串而*却没有。

在第一个插图中,+量词(1个或更多)找到所有四个小写的 a 字符(这是我的预期):

Plus-sign quantifier finds 1 or more as expected

在第二个插图中,*量词(0或更多)没有找到任何小写的 a 字符(这不是我的预期):

Asterisk quantifier doesn't find 0 or more

什么REGEX逻辑解释为什么“1或更多”(+)找到所有四个小写的 a 字符,但“0或更多”(*)找不到任何字符?

4 个答案:

答案 0 :(得分:45)

正则表达式引擎将尝试匹配字符串中每个位置的整个模式,从左到右。模式/a*/成功匹配字符串最开头的零a s。这就是你的regex101截图中的小点插入符号 - 在该位置的零宽度匹配。它会在该位置匹配更多a s,但没有。尽管如此,这场比赛是成功的。

如果你使用一个返回字符串中所有正则表达式匹配的函数,那么它每次最少会向前移动一个字符以查找新匹配,因此它将匹配aaaa(作为单个结果)一旦它到达它。 Python中的示例:

import re
regex = r"a*"
input = "AAAAaaaaBBBBbbbb"
print(re.findall(regex, input))

输出:

['', '', '', '', 'aaaa', '', '', '', '', '', '', '', '', '']

然而,当您使用/a+/时,它无法执行这些零宽度匹配,因此它会逐步完成输入,直到找到aaaa处的第一个且唯一匹配为止。

答案 1 :(得分:9)

其他答案已经描述了正在发生的事情。但是对于插图/示例,请尝试使用以下尺寸:

$ echo AAAAaaaabbbb | egrep -o 'a*' && echo "SUCCESS"

SUCCESS

grep -o选项的效果是仅向您显示与正则表达式匹配的输入部分。由于匹配恰好是“零字符”,结果是空的......但是成功。

答案 2 :(得分:7)

它实际上匹配字符串的开头,其中有一个零。如果你的字符串以a开头,它将匹配所有字符串。

答案 3 :(得分:3)

一开始你可以看到比赛!

What