ホームページ >バックエンド開発 >PHPチュートリアル >正規表現は ASCII 画像内の縦線の 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
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 サイトの他の関連記事を参照してください。