2016-07-01 18 views
3

Ich habe eine Gruppe von Wörtern und eine andere Gruppe mit einer Konjunktion. Ich bin auf der Suche nach einem regulären Ausdruck, dass jede einzelne dieser Worte entspricht, in die Verbindung zwischen anspruchs:Wie kann eine Capturing-Gruppe wiederverwendet werden, um eine andere Alternationsauswahl zu treffen?

  • Wenn die Worte sind (A|B|C)
  • und die Verbindung ist (&)
  • dann A & C übereinstimmen, C & B und sogar A & A
  • aber A + C, A C oder A & D nicht
entsprechen

Praktisches Beispiel: Betrachten Sie diese Plattform-agnostische Regex: /(Huey|Dewey|Louie) and \1/.

Ich will es „Huey und Louie“ oder „Dewey und Huey“ passen, aber es passt nur „Huey und Huey“, weil Rückreferenzierungen lediglich vorher angepasst Texte entsprechen.

konnte ich mich wiederholen, indem /(Huey|Dewey|Louie) and (Huey|Dewey|Louie)/ verwenden, aber ich denke, es gibt eine intelligentere Art der Wiederverwendung von Gruppen zu einem späteren Zeitpunkt zu erfassen. Ist das irgendwie machbar?

+0

@ rock321987: Lassen Sie uns hoffen, dass Sie ohne Grund Angst haben, nur noch eine kurze Weile. Wie auch immer, die Wörter Gruppe in eine Variable Konten für die DRY-Problem – dakab

+0

Ich denke, Sie haben jetzt eine Antwort von @melpomene, wenn Rekursion von Programmiersprache, die Sie verwenden, unterstützt .. – rock321987

+0

@ rock321987: Schade, dass Sie Ihren Kommentar gelöscht. – dakab

Antwort

4

Sie können dies tun, wenn Sie mit Perl (oder eine Sprache mit ausreichend kompatibel regulären Ausdrücke):

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

Der (?N) Teil ist ein „rekursive Teilmuster“, das gleiche wie das subregex passend bei der Erfassung Gruppe N. (Der Unterschied zwischen diesem und Rückreferenzierungen wie \N ist, dass \N entspricht den gleichen Zeichenfolge, die von der Erfassungsgruppe abgestimmt wurde (?N) wieder verwendet die Regex selbst..)

+0

Uhh, rekursive submuster, mir likey! Dies wurde offensichtlich für diesen Zweck konzipiert, und es ist sauber und kurz. Obwohl es als exotisch betrachtet werden könnte, scheint es von einer anständigen Anzahl von Regex-Engines unterstützt zu werden (http://www.rexegg.com/regex-recursion.html#engines). – dakab

+0

@SWLim: Ich weiß [was zu tun ist] (http://stackoverflow.com/help/someone-answers), wenn jemand antwortet. Machst du? Weil das * nicht * die richtige Lösung für * mich * ist, aber es ist eine gute und richtige Antwort. Trotzdem ist es nur fair, mindestens einen halben Tag auf etwas mehr Aufmerksamkeit zu warten. – dakab

+0

@dakab Sie haben einen guten Punkt, danke, dass Sie darauf hingewiesen haben. Entschuldigung, ich habe von Ihrem Kommentar ausgegangen, dass diese Antwort die richtige Lösung ist und dass Sie vielleicht vergessen haben, die Antwort zu akzeptieren. – SWLim