Maison  >  Article  >  développement back-end  >  Pouvez-vous trouver des lignes verticales de trois « X » dans une image ASCII à l’aide de Regex ?

Pouvez-vous trouver des lignes verticales de trois « X » dans une image ASCII à l’aide de Regex ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-08 12:42:02836parcourir

Can You Find Vertical Lines of Three 'X's in an ASCII Image Using Regex?

Correspondance Regex verticale dans une image ASCII

Le problème

Dans une image ASCII comme :

....X.......
..X..X...X....
X.X...X..X.....
X....XXXXXX.....
X..XXX...........
.....X..........
..............X
..X...........X....
..X...........X....X...
....X.....

nous' J'aimerais trouver une simple formation de ligne verticale de trois X sans utiliser les meilleures méthodes autres que l'expression régulière.

Question 1 : Existence d'une telle formation

Pour déterminer si une telle formation existe dans PCRE/ PHP, Perl, .NET ou expressions régulières similaires, nous pouvons utiliser l'expression suivante :

(?xm)                    # ignore comments and whitespace, ^ matches beginning of line
^                        # beginning of line
(?:
    .                    # any character except \n
    (?=                  # lookahead
        .*+\n            # go to next line
        ( ?+ . )       # add a character to the 1st capturing group
        .*+\n            # next line
        ( ?+ . )       # add a character to the 2nd capturing group
    )
)*?                      # repeat as few times as needed
X .*+\n                  # X on the first line and advance to next line
?+                     # if 1st capturing group is defined, use it, consuming exactly the same number of characters as on the first line
X .*+\n                  # X on the 2nd line and advance to next line
?+                     # if 2st capturing group is defined, use it, consuming exactly the same number of characters as on the first line
X                        # X on the 3rd line

Question 2 : Compter de telles formations

Correspondance simple
Pour correspondance directe et nécessitant le décompte du nombre de correspondances, cette question ne peut pas être directement résolue en PCRE ou Perl en raison d'une prise en charge limitée de l'analyse.

Longueur/Solution indirecte
Cependant, si la réponse est acceptée comme la durée d'un match ou d'un remplacement, alors on peut y répondre avec l'expression suivante :

^
(?:
    (?:                   # match .+? characters
        .
        (?=               # counting 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
        ( ?+ . )        # the number of matches = length of 
    )
)*                        # repeat as long as there are matches on this line
.*\n?                     # remove the rest of the line

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!

Déclaration:
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