Wie kann ich reguläre Ausdrücke verwenden, um vertikale Formationen von drei aufeinanderfolgenden „X'-Zeichen in einem ASCII-„Bild' zu zählen?

Patricia Arquette
Freigeben: 2024-11-08 06:18:02
Original
273 Leute haben es durchsucht

 How can I use regular expressions to count vertical formations of three consecutive

Vertikaler Regex-Abgleich in einem ASCII-„Bild“

Problemstellung

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.

Übereinstimmende Existenz (Frage 1)

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
Nach dem Login kopieren

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.

Vorkommen zählen (Frage 2)

Ü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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage