При написании скрипта перегибов в 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])$
) будет использоваться. Вместо этого используется вторая и меня смущает.
Если квантификатор удален, используется первый вариант. Я предполагаю, что это должно что-то сделать с жадностью или спецификой частей выражения, хотя я думал, что это выражение проверено слева направо.
Может ли кто-нибудь объяснить это поведение мне?
Что произойдет, если вы используете '([aeiou]) $ |. $'? – murgatroid99
Он сказал: * Если квантификатор удален, используется первый вариант. * – Bohemian
Я полностью пропустил это – murgatroid99