正则表达式中(\w+)?
和(\w*)
之间是否有任何区别?
我不明白是否有遗漏的东西。我在不同的代码中使用了它们,但它们似乎做了完全相同的事情。
它基本相同,对吗?
答案 0 :(得分:7)
就匹配的内容而言,(\w+)?
与(\w*)
之间存在无差异。它们都匹配0次或更多次\w
次。这也可以通过使用Perl的Regexp-Compare模块运行测试来测试,该模块产生了预期的结果。
就捕获群组而言,差异很大。如果(\w+)?
失败,则捕获组未初始化。在(\w*)
的情况下,它将被初始化但是将为空。所以在Perl "!"=~/(\w+)?/; print $1;
中会返回一个警告,1美元未定义,而"!"=~/(\w*)/; print $1;
是一个空字符串。
就效果而言,(\w*)
在步骤数方面必须 略微更好正则表达式引擎必须做,因此是首选。这当然取决于引擎。但是使用(\w*)
,与(\w+)?
相比,引擎永远不会执行回溯。
作为示例,我尝试在Perl中使用use re 'debug'
指令,并将两个正则表达式与空字符串进行比较。您可以比较每个步骤:
""=~/(\w+)?/
Matching REx "(\w+)?" against ""
0 <> <> | 1:CURLYX[0] {0,1}(10)
0 <> <> | 9: WHILEM(0)
whilem: matched 0 out of 0..1
0 <> <> | 3: OPEN1(5)
0 <> <> | 5: PLUS(7)
ALNUM can match 0 times out of 2147483647...
failed...
whilem: failed, trying continuation...
0 <> <> | 10: NOTHING(11)
0 <> <> | 11: END(0)
Match successful!
""=~/(\w*)/
Matching REx "(\w*)" against ""
0 <> <> | 1:OPEN1(3)
0 <> <> | 3:STAR(5)
ALNUM can match 0 times out of 2147483647...
0 <> <> | 5: CLOSE1(7)
0 <> <> | 7: END(0)
Match successful!
PS。如果你没有进入Perl,我认为可以用RegexBuddy调试正则表达式(我从来没有尝试过,但我听到了很多)。
答案 1 :(得分:2)
它基本相同,对吧?
是。在你的特殊情况下。 (0 or 1) of (1 or more)
= (0 or more)
。