2013-11-22 2 views
-3

мне было интересно, почему .* и .*? не то же самое в PCRE регулярных выражений (например, в preg_match РНР(). Точка . является символом для любого возможного характера и * является символом 0 до бесконечности повторения. Почему там символ ?, который означает от 0 до 1 повторения? Однако это не очевидно то же самое, потому что .*? не является взаимозаменяемым с .*, но я не вижу разницы в логике, я всегда должен попробовать, что работает и что не работает в определенном случае Я полагаю, что .* ничего не должен соответствовать, а ? избыточен, поскольку он указывает, что .* может быть 0 или 1 раз, но нулевое время - пустая строка, а пустая строка должна соответствовать .* тоже.PCRE: разница между. * И. *? в регулярных выражениях

Может ли кто-нибудь объяснить мне, что такое точная разница и показать мне короткий пример?

Благодаря

+0

http://www.regular-expressions.info/quickstart.html –

ответ

4

я люблю распутницу, потому что они вкусные закуски

В строке выше, скажем, вы пытаетесь сравнить его с i.*s. Результатом будет целая строка, потому что это называется greedy match. Он соответствует первому isntance от i до последнего экземпляра s.

Если вы должны были использовать нежадный модификатор ?, как i.*?s, то вы бы привести следующий:

я люблю распутницу

Это происходит потому, что не жадный ? модификатор соответствует только первому экземпляру s.

0

* является жадный матч - другими словами, матч от нуля до много раз, как столько раз, сколько это возможно. *? - минимальное совпадение - другими словами, совпадение с нолем до много раз, как можно меньше, чтобы остальная часть шаблона имела смысл. Аналогично, +? представляет собой минимально подходящую версию +.

Рассмотрите строку this is "quoted" and this is "also quoted". Регулярное выражение ".*" будет соответствовать одному результату, "quoted" and this is "also quoted"; ".*?" будет соответствовать дважды, "quoted" и "also quoted".

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