ホームページ  >  記事  >  バックエンド開発  >  正規表現を使用して ASCII 画像内の 3 つの「X」の縦線を見つけることができますか?

正規表現を使用して ASCII 画像内の 3 つの「X」の縦線を見つけることができますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-08 12:42:02920ブラウズ

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

ASCII 画像内の垂直正規表現マッチング

問題

次のような ASCII 画像では、

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

we'正規表現以外の最良の方法を使用せずに、3 つの X の単純な垂直線の形成を見つけたいと考えています。

質問 1: そのような形成の存在

そのような形成が PCRE/ に存在するかどうかを確認するにはPHP、Perl、.NET、または同様の正規表現では、次の式を使用できます:

(?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

質問 2: 形式のカウント

プレーン マッチング
For直接一致し、一致の数としてカウントが必要な場合、後読みサポートが制限されているため、この問題を PCRE または Perl で直接解決することはできません。

長さ/間接的な解決策
ただし、答えは一致または置換の長さとして受け入れられ、次の式で答えることができます:

^
(?:
    (?:                   # 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

以上が正規表現を使用して ASCII 画像内の 3 つの「X」の縦線を見つけることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。