Есть ли разница между (\w+)?
и (\w*)
в регулярном выражении? Я не понимаю, есть ли что-то, что мне не хватает. Я использовал оба в разных кодах, но они, похоже, делают то же самое. Это в основном то же самое, не так ли?Are ( w +)? и ( w *) то же самое?
ответ
С точки зрения , что они соответствующих, нет никакой разницы между
(\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 (я никогда не пробовал, но я это слышу много).
Заключение: используйте '(\ w *)', а не '(\ w +)?'! – psxls
Это в основном то же самое, не так ли?
Да. В вашем конкретном случае. (0 or 1) of (1 or more)
= (0 or more)
.
«В вашем конкретном случае», можете ли вы дать дело где они не то же самое? – OGHaza
Просто хочу, чтобы люди заботились. Я имею в виду внимательно посмотреть на регулярное выражение, чтобы увидеть, что ваш шаблон применяется (например, размещение брекетов и т. Д.). Если это смущает, я могу удалить комментарий. – xagyg
- 1. Выражение для проверки подлинности электронной почты \ w + ([- +. '] \ W +) * @ \ w + ([-.] \ W +) * \. \ W + ([-.] \ W +) * позволяет пустые пространства
- 2. Я использую Regex для проверки электронной почты EMAIL_PATTERN:/^ (\ w + ([.] \ W +) * @ \ w + ([.] \ W +) * \. \ W + ([.] \ W +) *) $/
- 3. Значение регулярного выражения (\ W | $) и (\ W | ^)
- 4. В чем разница между% w и% W
- 5. Ruby Rails% r и% w
- 6. Регулярное выражение -/\ w \ b \ w/
- 7. Рубиновые массивы:% w против% W
- 8. В чем смысл r в REGEXP_EXTRACT (word, r '(\ w \ w \' \ w \ w) ')
- 9. Python - разность понятий понимания между w и w [0]
- 10. В чем разница между% w {} и% W {} верхними и нижними аргументами массива W массивов в Ruby?
- 11. Lucene Scoring: TermQuery w & w/o TermVectors
- 12. Как расширить диапазон \ w \ d + - \ w \ d +
- 13. Первая строка Javascript-файла - var w = w || {};
- 14. Шаблон p = Pattern.compile ("(? <! \\ w) [tT] \\ w +");
- 15. Использование переменных с% w или% W - Ruby
- 16. Автоматически ctrl-w w to vimrc
- 17. ^[A-Za-z] (\ W | \ w) * регулярное выражение?
- 18. php string - то же самое и все же не то же самое
- 19. Разница между: w и: w! in vi editor
- 20. Разница между этими двумя командами (w & w/out "") и почему?
- 21. jQuery -Wildcard Selector Starts w/String и заканчивается w/Variable
- 22. используя -W вариант Vim
- 23. То же самое датируется и не отображается.
- 24. Почему arr и & arr то же самое?
- 25. php \ r и \ n то же самое?
- 26. Устойчив и на месте то же самое?
- 27. Сделайте vector.emplace_back() и vector.push_back() то же самое?
- 28. Есть clearTimeout и clearInterval то же самое?
- 29. Ловить исключение и бросать то же самое?
- 30. - это `Matchers.hasItem` и` Matchers.contains` то же самое?
Возможный дубликат [regex: plus sign vs asterisk] (http://stackoverflow.com/questions/18364673/regex-plus-sign-vs-asterisk) – PeeHaa