Comment puis-je utiliser des expressions régulières pour compter les formations verticales de trois caractères « X » consécutifs dans une « image » ASCII ?

Patricia Arquette
Libérer: 2024-11-08 06:18:02
original
269 Les gens l'ont consulté

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

Correspondance d'expression régulière verticale dans une "image" ASCII

Énoncé du problème

Dans une représentation textuelle d'une image composée de caractères ASCII, nous cherchons à identifier les formations verticales de trois caractères "X" consécutifs. La largeur et le nombre de lignes dans l'image peuvent varier.

Matching Existence (Question 1)

Pour déterminer l'existence d'une telle formation, nous pouvons utilisez l'expression régulière suivante :

(?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
Copier après la connexion

Cette expression exploite les anticipations avec des groupes de capture auto-référencés pour ajouter un caractère pour chaque répétition de ligne et les « compter ». Ce n'est que lorsque toutes les conditions seront remplies que l'expression régulière correspondra, indiquant la présence de la formation.

Comptage des occurrences (Question 2)

Correspondance Utilisation de la longueur

Bien que PCRE et Perl (et les versions similaires) ne puissent pas compter directement les occurrences à l'aide d'une expression régulière, une solution alternative consiste à utiliser la longueur du résultat de la substitution comme mesure. En remplaçant toutes les occurrences de l'expression suivante par « $3 », la longueur de la chaîne résultante fournit le décompte :

^
(?:
    (?:                   # 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
Copier après la connexion

Cette expression utilise une approche similaire à la question 1 mais inclut X dans les caractères comptés et quantifie le nombre des correspondances à l'aide d'une analyse anticipée.

Correspondance à l'aide de correspondances

Bien que les analyses ultérieures de longueur variable ne soient pas disponibles dans la plupart des versions d'expressions régulières, certaines, comme Java et .NET, peuvent fournir des solutions partielles . En utilisant les lookbehinds, il est possible de compter directement les occurrences sans se fier à la longueur du résultat de la substitution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal