+为什么*不匹配?

RBV*_*RBV 25 regex pcre

在下面的例子中(通过regex101.com,PCRE模式),我无法弄清楚为什么+量词找到一个子串但*没有.

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

加号量词按预期发现1或更多

在第二个图中,*量词(0或更多)未找到任何小写一个字符(这不是我所期望的):

星号量词未找到0或更多

正则表达式是什么逻辑解释了为什么"1个或多个"(+)发现所有四个小写一个字符,但"0或更多"(*)未找到任何?

Boa*_*ann 45

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

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

import re
regex = r"a*"
input = "AAAAaaaaBBBBbbbb"
print(re.findall(regex, input))
Run Code Online (Sandbox Code Playgroud)

输出:

['', '', '', '', 'aaaa', '', '', '', '', '', '', '', '', '']
Run Code Online (Sandbox Code Playgroud)

然而,当你使用时/a+/,它不能做那些零宽度匹配,所以它逐步完成输入,直到它找到它的第一个和唯一匹配aaaa.

  • 贪婪与否,`a*`匹配字符串开头的'a`的零次出现,为什么解析器会更进一步?我不知道"Sublime"是什么,但听起来很糟糕. (12认同)
  • Sublime可能会忽略零大小的匹配,只是为了作为编辑器有用.我非常确定*会表现正常(匹配0个字符以及1+),只要整个匹配在sublime中至少有1个字符. (9认同)

gho*_*oti 9

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

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

SUCCESS
Run Code Online (Sandbox Code Playgroud)

grep -o选项的作用是仅显示与正则表达式匹配的输入部分.由于匹配恰好是"零字符",结果是空的......但是成功了.

  • 无论出于何种原因,当我在Mint Linux 17.3上尝试(通过复制和粘贴)时,egrep在"SUCCESS"一词上方显示"aaaa" (2认同)

kar*_*kfa 7

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