ホームページ >バックエンド開発 >PHPチュートリアル >正規表現は ASCII 画像内の縦線の 3 つの X を検出できますか?

正規表現は ASCII 画像内の縦線の 3 つの X を検出できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-08 02:47:01458ブラウズ

Can a Regular Expression Detect Three Xs in a Vertical Line Formation in an ASCII Image?

3 つの X の垂直線形成が存在するかどうかを確認します

PCRE/PHP、Perl、.NET などの最新の正規表現を使用すると、次のことを確認できます。 ASCII「画像」に 3 つの X の垂直線形成が存在する場合。

次の正規表現を考えてみましょう。

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

この式は、自己参照キャプチャ グループによる先読みを使用して、 X の前の各行の文字数。先読みで指定された条件に一致することにより、縦方向の 3 つの X 文字との一致が試行されます。

オンライン デモ: https://regex101 .com/r/Xb5FXl/2

3 つの X の垂直線形成の数を数える

Perl や PCRE などの後読みが制限された正規表現では直接解決できませんが、次のことは可能です。一致した文字列を操作することで間接的にカウントを決定します。

次の解決策は、3 つの X が出現する一致部分の文字数を一致させてカウントすることにより、m.buettner の「部分的な PCRE 解決策」を変更します。

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

この式は前の式と同じ形式に一致しますが、3 番目のキャプチャ グループを追加し、そのグループ内で一致した文字の長さをカウントします。一致を 3 番目のキャプチャ グループの内容のみで置き換えることにより、結果の文字列の長さは 3-X 構成の数を表します。

Perl での使用例:

$in =~ s/regex//gmx;
$count = length $in;

オンライン デモ: https://regex101.com/r/iqxY1a/1

テスト ケース:

Test #0:
--------------------
X
X
X

result: 1 (X)


Test #1:
--------------------
..X....
..X....
..X....

result: 1 (.)


Test #2:
--------------------
..X.X..
..X.X..
....X..

result: 1 (.)


Test #3:
--------------------
..X....
..X....
...X...

result: 0 ()


Test #4:
--------------------
..X....
...X...
..X....

result: 0 ()


Test #5:
--------------------
....X..
.X..X..
.X.....

result: 0 ()


Test #6:
--------------------
.X..X..
.X.X...
.X.X...

result: 1 (.)


Test #7:
--------------------
.X..X..
.X..X..
.X..X..

result: 2 (.X)


Test #8:
--------------------
XXX
XXX
XXX

result: 3 (XXX)


Test #9:
--------------------
X.X.X
XXXXX
XXXXX
.X.X.

result: 5 (XXXXX)


Test #10:
--------------------
1....X.......
2..X..X...X....
3X.X...X..X.....
4X....XXXXXX.....
5X..XXX...........
6.....X..........
7.........X....X
8..X......X....X....
9..X......X....X....X...
A....X.....
B.X..X..
C.....
XXX
XXX
XXX
.

result: 8 (3458.XXX)

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

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