Heim >Backend-Entwicklung >PHP-Tutorial >Wie kann ich reguläre Ausdrücke verwenden, um vertikale Formationen von drei aufeinanderfolgenden „X'-Zeichen in einem ASCII-„Bild' zu zählen?
In einer textbasierten Darstellung eines aus ASCII-Zeichen zusammengesetzten Bildes versuchen wir, vertikale Formationen aus drei aufeinanderfolgenden „X“-Zeichen zu identifizieren. Die Breite und Anzahl der Linien im Bild kann variieren.
Um die Existenz einer solchen Formation festzustellen, können wir Verwenden Sie den folgenden regulären Ausdruck:
(?xm) ^ # Beginning of line (?: . # Any character except newline (?= # Lookahead .*+\n # Move to next line ( ?+ . ) # Add a character to capturing group 1 .*+\n # Next line ( ?+ . ) # Add a character to capturing group 2 ) )*? # Repeat as necessary X .*+\n # X on first line, advance to next line ?+ # If capturing group 1 is defined, use it X .*+\n # X on second line, advance to next line ?+ # If capturing group 2 is defined, use it X # X on third line
Dieser Ausdruck nutzt Lookaheads mit selbstreferenzierenden Erfassungsgruppen, um für jede Zeilenwiederholung ein Zeichen hinzuzufügen und diese zu „zählen“. Nur wenn alle Bedingungen erfüllt sind, stimmt der reguläre Ausdruck überein und zeigt das Vorhandensein der Formation an.
Übereinstimmung Verwendung der Länge
Während PCRE und Perl (und ähnliche Varianten) Vorkommen mithilfe eines regulären Ausdrucks nicht direkt zählen können, besteht eine alternative Lösung darin, die Länge des Substitutionsergebnisses als Maß zu verwenden. Indem alle Vorkommen des folgenden Ausdrucks durch „$3“ ersetzt werden, liefert die Länge der resultierenden Zeichenfolge die Anzahl:
^ (?: (?: # Match .+? characters . (?= # Count the same number on the following two lines .*+\n ( ?+ . ) .*+\n ( ?+ . ) ) )+? (?<= X ) # Till the above consumes an X (?= # That matches the following conditions .*+\n ?+ (?<= X ) .*+\n ?+ (?<= X ) ) (?= # Count the number of matches .*+\n ( ?+ . ) # Number of matches = length of ) )* # Repeat as long as there are matches on this line .*\n? # Remove the rest of the line
Dieser Ausdruck verwendet einen ähnlichen Ansatz wie Frage 1, schließt jedoch X in die gezählten Zeichen ein und quantifiziert die Anzahl von Übereinstimmungen mithilfe eines Lookahead.
Abgleich mithilfe von Übereinstimmungen
Obwohl Lookbehinds variabler Länge in den meisten Regex-Varianten nicht verfügbar sind, können einige, wie Java und .NET, Teillösungen bereitstellen . Durch die Verwendung von Lookbehinds ist es möglich, die Vorkommen direkt zu zählen, ohne sich auf die Länge des Ersetzungsergebnisses zu verlassen.
Das obige ist der detaillierte Inhalt vonWie kann ich reguläre Ausdrücke verwenden, um vertikale Formationen von drei aufeinanderfolgenden „X'-Zeichen in einem ASCII-„Bild' zu zählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!