Как повторно использовать группу захвата для соответствия другому варианту чередования?

У меня есть группа слов и еще одна группа с союзом. Я ищу регулярное выражение, которое соответствует любому из этих слов, требуя соединения между ними:

  • Если слова (A|B|C)
  • и соединение (&)
  • затем сопоставьте A & C, C & B и даже A & A
  • но не соответствуют A + C, A C или A & D

Практический пример. Рассмотрим это регулярное выражение, не зависящее от платформы: /(Huey|Dewey|Louie) and \1/.

Я хочу, чтобы он соответствовал «Хьюи и Луи» или «Дьюи и Хьюи», но он соответствует только «Хьюи и Хьюи», потому что обратные ссылки просто соответствуют ранее сопоставленным текстам.

Я мог бы повторить себя, используя /(Huey|Dewey|Louie) and (Huey|Dewey|Louie)/, но я думаю, что есть более разумный способ повторно использовать группы захвата в более позднее время. Это как-то возможно?


person dakab    schedule 01.07.2016    source источник
comment
@ rock321987: Надеюсь, ты еще ненадолго боишься без всякой причины. В любом случае, включение группы слов в переменную приводит к проблеме СУХОЙ   -  person dakab    schedule 01.07.2016
comment
Я думаю, что у вас есть ответ от @melpomene, если рекурсия поддерживается языком программирования, который вы используете.   -  person rock321987    schedule 01.07.2016
comment
@ rock321987: Жаль, что вы удалили свой комментарий.   -  person dakab    schedule 01.07.2016
comment
что ж, этот комментарий не будет иметь смысла сейчас, когда на него ответят   -  person rock321987    schedule 01.07.2016


Ответы (1)


Вы можете сделать это, если используете Perl (или язык с достаточно совместимыми регулярными выражениями):

/(Huey|Dewey|Louie) and (?1)/

Часть (?N) - это «рекурсивный подшаблон», совпадающий с тем же самым, что и подрегекс в группе захвата N. (Разница между этой ссылкой и обратными ссылками, такими как \N, заключается в том, что \N соответствует той же строке, которая была сопоставлена ​​группой захвата. (?N) повторно использует само регулярное выражение.)

person melpomene    schedule 01.07.2016
comment
Эээ, рекурсивный подшаблон, мне нравится! Очевидно, это было задумано для этой цели, и оно чистое и короткое. Несмотря на то, что это может показаться экзотическим, кажется, что он поддерживается приличным количеством механизмов регулярных выражений.. - person dakab; 01.07.2016
comment
@SWLim: я знаю, что делать, когда кто-то ответит. Ты? Потому что это неправильное решение для меня, но это хороший и правильный ответ. Тем не менее, будет справедливо подождать хотя бы полдня, чтобы привлечь больше внимания. - person dakab; 01.07.2016
comment
@dakab У вас есть хорошее мнение, спасибо, что указали на это. Извините, я предположил из вашего комментария, что этот ответ является правильным решением и что вы, возможно, забыли принять ответ. - person swlim; 01.07.2016