Palindrom mit Regex finden

8

Diese Frage versucht, eine der folgenden Antworten zu verstehen: Wie überprüft man, ob eine Zeichenkette mit regulären Ausdrücken ein Palindrom ist?

Antwort von Markus Jarderot ist:

%Vor%

Kann mir bitte jemand erklären, was genau hier passiert .... ich muss ähnliches in Perl machen, aber nicht in der Lage diese Lösung zu verstehen !!!

PS: Ich bin nicht sehr gut in Perl, also bitte gehe einfach ... und auch "das kann nicht als regulärer Ausdruck angesehen werden, wenn du streng sein willst" - ich lese diese Zeile, also ich Mir ist bewusst, dass dies nicht streng regulär ist

    
NoobEditor 12.03.2014, 10:59
quelle

2 Antworten

13
  • ^ - Entspricht dem Anfang der Zeichenfolge
  • ( - Startet die Erfassungsgruppe # 1
  • (.) - entspricht jedem einzelnen Zeichen außer einem Zeilenumbruch, speichern Sie es in der Erfassungsgruppe # 2
  • (?1) - recurse = Ersetze diese Gruppe durch die gesamte Regexp-Erfassungsgruppe # 1
  • - entspricht der gleichen Funktion wie die Erfassungsgruppe # 2. Dies erfordert, dass die ersten und letzten Zeichen der Zeichenfolge einander entsprechen.
  • | - erstellt eine Alternative
  • .? - passt optional auf ein beliebiges Zeichen, das kein Zeilenumbruch ist - Dies behandelt das Ende der Rekursion, indem es eine leere Zeichenfolge (wenn die ganze Zeichenfolge eine gerade Länge ist) oder ein einzelnes Zeichen (wenn es eine ungerade Länge ist)
  • ) - beendet die Erfassungsgruppe # 1
  • $ - Entspricht dem Ende der Zeichenfolge oder vor einem Zeilenumbruch am Ende der Zeichenfolge.

Die Rekursion (?1) ist der Schlüssel. Ein Palindrom ist eine leere Zeichenfolge, eine 1-stellige Zeichenfolge oder eine Zeichenfolge, deren erstes und letztes Zeichen identisch sind und die Teilzeichenfolge zwischen ihnen ebenfalls ein Palindrom ist.

    
Barmar 12.03.2014, 11:34
quelle
3

Es ist vielleicht einfacher, mit dieser analogen Funktion zu verstehen, die dasselbe für Arrays tut:

%Vor%

Die (?1) -Notation ist eine rekursive Referenz auf den Anfang der ersten Klammer in der Regex, die ist eine Rückreferenz in der aktuellen Rekursion auf (.) . Diese beiden sind am Anfang und am Ende von "was auch immer an der aktuellen Rekursionstiefe passt" verankert, sodass alles andere in der nächsten Tiefe nach unten passt.

Ikegami vermutet, dass dies schneller ist:

%Vor%     
bazzargh 12.03.2014 11:32
quelle

Tags und Links