2012-05-23 2 views
1

При написании скрипта перегибов в php я натолкнулся на странное (по крайней мере, на меня) поведение. Похоже, что мое регулярное выражение, содержащее множество разных шаблонов для окончаний слов, соответствует второй приемлемой опции, даже если первая полностью в порядке.Регулярные выражения, соответствующие приоритетной странности

Полное выражение выглядит следующим образом (вы действительно не нужно обращать на это внимание):

([kpt])\1([aou])$|(?:(n)t)?([auo])$|([aeou][^aeiouyäö]+[aeiou])$|([auo][^aeiouyäö]+)$|([^aeiouyäö])(?!\6)([^aeiouyäö])(e)$|((?:[auo]i|[auo])[^aeiouyäö]*)([aeiouyäö])\10$ 

Излишне говорить, что я первым заподозрил, что я сделал ошибку где-то, так что я упрощенных выражение вниз понемногу и, наконец, добрались до этой стадии:

([aeiou])$|(.+)$ 

что надо буквально означает «заменяющий один гласный в конце строки и использовать его в качестве обратной ссылки 1 или, если это не удается, просто соответствуют любому символу, любое число времени до конца строки и использовать ее как backreferenc e 2 "

При использовании с строкой, как foo Я бы ожидал, что первая часть выражения (([aeiou])$) будет использоваться. Вместо этого используется вторая и меня смущает.

Если квантификатор удален, используется первый вариант. Я предполагаю, что это должно что-то сделать с жадностью или спецификой частей выражения, хотя я думал, что это выражение проверено слева направо.

Может ли кто-нибудь объяснить это поведение мне?

+0

Что произойдет, если вы используете '([aeiou]) $ |. $'? – murgatroid99

+0

Он сказал: * Если квантификатор удален, используется первый вариант. * – Bohemian

+0

Я полностью пропустил это – murgatroid99

ответ

1

Матч один гласный в конце строки [...] или если это не, матч только любой символ любое количество раз до конца строки [...]

Нет, это не то, что это значит. Правильная интерпретация:

Match дольше из:

  • один гласный в конце строки
  • любого символа любое количество раз до конца строки

(Я не знаю, хорошо ли указаны правила тай-брейка.)

+0

Действительно ли это всегда ** дольше **? – jpeltoniemi

+0

@Pichan: Я бы не сказал «всегда» (разные пакеты регулярных выражений имеют разную семантику). Однако в этом конкретном случае * самый длинный матч *, * самый длинный из самых левых совпадений * и * первый действительный матч * дают одинаковый результат. И никакого пакета регулярных выражений, с которым я когда-либо сталкивался, есть какая-то логика if-then-else для оператора '|'. – NPE

+0

Я совершенно не знал об этом. Большое спасибо! Вы случайно не знаете, существует ли реальный оператор __OR__ или способ его микшировать в регулярном выражении? – jpeltoniemi

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