2016-09-19 15 views
1

У меня возникли проблемы с названными группами захвата и их повторным использованием. Похоже, когда я назвал группу захвата A, и она сначала захватывает что-то вроде asd, и я использую \ k и пытаюсь снова использовать выражение группы захвата A, это не работает, потому что оно не соответствует регулярному выражению I originaly написал в группе A, но вместо этого он пытается сопоставить то, что A соответствовало ранее, что является «asd».Regex: снова использовать группу захвата

Так что, если у меня есть что-то вроде:

^(?<A>(?:a|s|d))\k<A>$ 

И я печатаю:

aa 

Это работает, так как группа захвата Первая соответствует буква а и \k<A> теперь также ищут а.

Ввод текста в as не работает, однако, поскольку первый совпадающий a и \k<A> теперь ищет другого a.

Что я хочу сделать, это повторное использование самого регулярного выражения группы захвата A еще раз. Поэтому я хочу \k<A> = (?:a|s|d).

В чем проблема и есть ли способ исправить это?

Спасибо!

+2

Вы ищете [рекурсия] (http://www.regular-expressions.info/recurse.html). К сожалению, это не широко поддерживаемая функция. Я не думаю, что posix-ere поддерживает его. –

+0

@Rawing Да, это сработало. Вместо этого я использовал \ g'name ', но были проблемы с моим текущим регулярным выражением, но теперь все работает. Отправьте это как ответ, и я дам вам очки. – Piwwoli

+0

Здесь не так, если вы можете использовать '\ g'name'' тег posix-ere. Какая среда? PHP? Рубин? –

ответ

1

Использование pcre вы можете использовать рекурсию.
Но, Рекурсия является неправильным выражением imo, это больше похоже на вызов функции.

Предпочтительный способ:

^
(?&A) 
(?&A) 
$ 
(?(DEFINE)  # Functions 
     (?<A>       # (1 start) 
      (?: a | s | d) 
    )        # (1 end) 
) 

Рядный путь:

^
(?<A>       # (1 start) 
     (?: a | s | d) 
)        # (1 end) 
(?&A) 
$ 

Оба делают примерно то же самое. При использовании встроенного способа это все равно только вызов функции.
Когда вы вызываете себя внутри функции, это более рекурсивно.
I.e. (?<A>(?:a|b|c)(?&A)*) и нуждается в специальной защите.