是(\ w +)?和(\ w *)一样吗?

时间:2013-11-27 22:36:03

标签: regex

正则表达式中(\w+)?(\w*)之间是否有任何区别? 我不明白是否有遗漏的东西。我在不同的代码中使用了它们,但它们似乎做了完全相同的事情。 它基本相同,对吗?

2 个答案:

答案 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)