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.
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
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.
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
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!