2015-05-03 5 views
2

Рассмотрим ECMAScript RegExУпрощая регулярное выражение с помощью обратной ссылки

/\s*((ABC|A)(/(ABC|A)+)*)\s*/i 

, который соответствует A/ABC

Использование обратной ссылки, я пытаюсь ее упростить, переписав его

/\s*((ABC|A)(/\2+)*)\s*/i 

но это похоже только на соответствие A/A

Почему я испытываю такое поведение и могу Я использую backreference здесь, чтобы упростить RegEx? (Я тестирую его в Интернете по адресу http://www.regexr.com/)

+1

Резервная ссылка не означает, что она соответствует одному и тому же шаблону, но соответствует той же строке. – Gumbo

+0

Ты так прав, Гумбо! Я неверно истолковал это, когда читал об обратных ссылках! На определенном веб-сайте я нашел следующее предложение, которое объясняет все это: «Обратные ссылки соответствуют тому же тексту, что и предыдущая группа захвата». Это, конечно, почему я только матч A/A! Итак, теперь мой вопрос преобразуется в «Если есть группа захвата, которая появляется в нескольких местах в вашем регулярном выражении, есть ли способ сделать ваше регулярное выражение короче»? –

ответ

0

Причина, по которой это происходит потому, что новый регулярное выражение, которое вы должны будете только A/A или A/AA или A/AAA (любое количество элементов а после /). (Технически это будет также соответствовать ABC/ABC или ABC/ABCABC)

* после вашего (/\2+) захвата группы соответствует любому количеству группы (/\2+) захвата. Так что, если вы не все равно, что приходит после A/A (т.е. A/AFOO), то вы могли бы сделать /\s*((ABC|A)(/\2+).*)\s*/i, который будет соответствовать A/A(whatever here), (т.е. A/ABC, A/ADC, A/Afoobar)

В противном случае, я бы рекомендовал придерживаться оригинального регулярного выражения.

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

  • Нет связанных вопросов^_^