为什么 * 不匹配而 + 匹配?
Why doesn't * match when + does?
在以下示例中(通过 regex101.com,PCRE 模式),我不明白为什么 + 量词找到了一个子字符串而 * 却没有。
在第一个插图中,+ 量词(1 或更多)找到所有四个小写 a 字符(这是我所期望的):
在第二个插图中,* 量词(0 或更多)没有找到任何小写 a 字符(这不是我所期望的):
什么 REGEX 逻辑解释了为什么“1 个或多个”(+) 找到所有四个小写 a 个字符,但“0 个或多个”(*) 找不到任何?
它实际上匹配字符串的开头,其中 a 为零。如果您的字符串以 a 开头,它将匹配所有字符串。
正则表达式引擎将尝试匹配字符串中每个位置的整个模式,从左到右。模式 /a*/
成功匹配字符串开头的零 a
。这就是您的 regex101 屏幕截图中的小虚线插入符号所表示的——该位置的零宽度匹配。它会在那个位置匹配更多的a
,但是有none。尽管如此,比赛还是成功了。
如果您使用 returns 匹配字符串中所有正则表达式的函数,那么它每次至少会向前移动一个字符来寻找新的匹配项,因此它将匹配 aaaa
(作为一个结果)一旦到达它。 Python 中的示例:
import re
regex = r"a*"
input = "AAAAaaaaBBBBbbbb"
print(re.findall(regex, input))
输出:
['', '', '', '', 'aaaa', '', '', '', '', '', '', '', '', '']
然而,当您使用 /a+/
时,它无法进行那些零宽度匹配,因此它会遍历输入,直到在 aaaa
处找到第一个也是唯一的匹配项。
其他答案已经描述了发生了什么。但是对于 illustration/example,试试这个尺码:
$ echo AAAAaaaabbbb | egrep -o 'a*' && echo "SUCCESS"
SUCCESS
grep 的 -o
选项的作用是只显示与正则表达式匹配的输入部分。由于匹配的恰好是"zero characters",所以结果为空……但是成功了。
开头可以看到匹配!
在以下示例中(通过 regex101.com,PCRE 模式),我不明白为什么 + 量词找到了一个子字符串而 * 却没有。
在第一个插图中,+ 量词(1 或更多)找到所有四个小写 a 字符(这是我所期望的):
在第二个插图中,* 量词(0 或更多)没有找到任何小写 a 字符(这不是我所期望的):
什么 REGEX 逻辑解释了为什么“1 个或多个”(+) 找到所有四个小写 a 个字符,但“0 个或多个”(*) 找不到任何?
它实际上匹配字符串的开头,其中 a 为零。如果您的字符串以 a 开头,它将匹配所有字符串。
正则表达式引擎将尝试匹配字符串中每个位置的整个模式,从左到右。模式 /a*/
成功匹配字符串开头的零 a
。这就是您的 regex101 屏幕截图中的小虚线插入符号所表示的——该位置的零宽度匹配。它会在那个位置匹配更多的a
,但是有none。尽管如此,比赛还是成功了。
如果您使用 returns 匹配字符串中所有正则表达式的函数,那么它每次至少会向前移动一个字符来寻找新的匹配项,因此它将匹配 aaaa
(作为一个结果)一旦到达它。 Python 中的示例:
import re
regex = r"a*"
input = "AAAAaaaaBBBBbbbb"
print(re.findall(regex, input))
输出:
['', '', '', '', 'aaaa', '', '', '', '', '', '', '', '', '']
然而,当您使用 /a+/
时,它无法进行那些零宽度匹配,因此它会遍历输入,直到在 aaaa
处找到第一个也是唯一的匹配项。
其他答案已经描述了发生了什么。但是对于 illustration/example,试试这个尺码:
$ echo AAAAaaaabbbb | egrep -o 'a*' && echo "SUCCESS"
SUCCESS
grep 的 -o
选项的作用是只显示与正则表达式匹配的输入部分。由于匹配的恰好是"zero characters",所以结果为空……但是成功了。
开头可以看到匹配!