2013-11-27 2 views
1

Есть ли разница между (\w+)? и (\w*) в регулярном выражении? Я не понимаю, есть ли что-то, что мне не хватает. Я использовал оба в разных кодах, но они, похоже, делают то же самое. Это в основном то же самое, не так ли?Are ( w +)? и ( w *) то же самое?

+0

Возможный дубликат [regex: plus sign vs asterisk] (http://stackoverflow.com/questions/18364673/regex-plus-sign-vs-asterisk) – PeeHaa

ответ

7
  • С точки зрения , что они соответствующих, нет никакой разницы между (\w+)? и (\w*). Они оба соответствуют 0 или более вхождений \w. Это также можно протестировать, выполнив тест с модулем Perl Regexp-Compare, который дал ожидаемый результат.

  • В терминах группы захвата, есть большая разница . В случае (\w+)?, если он терпит неудачу, группа захвата НЕ инициализируется. В случае (\w*) он будет инициализирован, но будет пустым. Таким образом, в Perl "!"=~/(\w+)?/; print $1; вернет предупреждение за неопределенность $ 1, а "!"=~/(\w*)/; print $1; - пустую строку.

  • С точки зрения производительности , то (\w*) должен быть слегка лучше с точки зрения количества шагов, что регулярное выражение двигатель должен делать, и, таким образом, предпочтительным. Конечно, это зависит от двигателя. Но с (\w*) двигателю никогда не придется выполнять откат по сравнению с (\w+)?.

    В качестве примера я попытался использовать директиву use re 'debug' в Perl и сравнил два регулярных выражения с пустой строкой. Вы можете сравнить шаги для каждого из них:

""=~/(\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 (я никогда не пробовал, но я это слышу много).

+0

Заключение: используйте '(\ w *)', а не '(\ w +)?'! – psxls

2

Это в основном то же самое, не так ли?

Да. В вашем конкретном случае. (0 or 1) of (1 or more) = (0 or more).

+0

«В вашем конкретном случае», можете ли вы дать дело где они не то же самое? – OGHaza

+0

Просто хочу, чтобы люди заботились. Я имею в виду внимательно посмотреть на регулярное выражение, чтобы увидеть, что ваш шаблон применяется (например, размещение брекетов и т. Д.). Если это смущает, я могу удалить комментарий. – xagyg

Смежные вопросы