regex — именованная обратная ссылка регулярного выражения в переполнении стека

Используя регулярные выражения PHP 5.5+, я хотел бы использовать именованные обратные ссылки для захвата группы.

Например, я хотел бы, чтобы следующие тексты соответствовали:

1-1
2-2

но не следующее

8-7

Однако когда я пытаюсь использовать обратные ссылки, PHP помечает его как найденное совпадение:

/* This statement evaluates to 1 */
preg_match("/(?<one>[1-9])\-(?<two>\\g<one>)/", "8-7");

Есть ли обходной путь для этого, кроме использования нумерованных ссылок?

2

Решение

Смотрите этот отрывок из PCRE документация:

Для совместимости с Oniguruma, синтаксис не Perl \g с последующим
имя или число, заключенные либо в угловые скобки, либо в одинарные кавычки,
альтернативный синтаксис для ссылки на подшаблон как
подпрограмма, возможно, рекурсивно.

Обратите внимание, что \g{...} (Синтаксис Perl) и \g<...> (Синтаксис Онигурума)
не синоним Первый является обратной ссылкой; последний является
вызов подпрограммы.

Используя \g<one>, вы ссылаетесь не на совпадение, а на подшаблон, см. объяснение на regex101.com.

\g<one> рекурсивно подшаблон one

Вам нужно использовать \1 фактически соответствовать тому же тексту, захваченному в первой группе.

(?<one>[1-9])\-(?<two>\1)

Или (именованная обратная ссылка на фактический текст),

(?<one>[1-9])\-(?<two>\g{one})

\1 соответствует тому же тексту, что и последний найденный при первом захвате
группа

Увидеть пронумерованное демо и именная обратная ссылка демо.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]