在以下示例中(通过regex101.com,PCRE模式),我无法弄清楚为什么+量词会找到一个子字符串而*却没有。
在第一个插图中,+量词(1个或更多)找到所有四个小写的 a 字符(这是我的预期):
在第二个插图中,*量词(0或更多)没有找到任何小写的 a 字符(这不是我的预期):
什么REGEX逻辑解释为什么“1或更多”(+)找到所有四个小写的 a 字符,但“0或更多”(*)找不到任何字符?
答案 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)