ASCII 画像またはマップを分析する状況では、次のような状況が発生することがあります。特定のパターンを特定することが必要になります。そのようなパターンの 1 つは、3 つの X の縦線形成です。正規表現を使用すると、このタスクに効果的に取り組むことができます。
垂直線が存在するかどうかを判断するには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 に置き換えることで、質問 2 の答え (パターンの数) を得ることができます。
^ (?: (?: # 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
この式は、最初の質問と同様の手法を使用していますが、最初の先読みで一致した文字に X を含め、それを量指定子でラップするように変更されています。
結果の文字列の長さをカウントとして利用することで、このソリューションは質問 2 に答えるための間接的なアプローチを提供します。
以上が正規表現を使用して ASCII 画像の縦線の数をカウントできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。