ASCII 文字で構成される画像のテキストベースの表現で、3 つの連続する「X」文字の垂直方向の構成を識別しようとします。画像内の線の幅と数はさまざまです。
そのような構成の存在を判断するには、次のことができます。次の正規表現を使用します:
(?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
この式は、自己参照キャプチャ グループの先読みを利用して、各行の繰り返しに文字を追加し、それらを「カウント」します。すべての条件が満たされた場合にのみ、正規表現が一致し、フォーメーションの存在が示されます。
一致長さの使用
PCRE と Perl (および同様のフレーバー) は正規表現を使用して出現回数を直接カウントできませんが、代わりの解決策は、置換結果の長さを尺度として使用することです。次の式のすべての出現箇所を「$3」に置き換えることで、結果の文字列の長さがカウントを提供します:
^ (?: (?: # 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
この式は、質問 1 と同様のアプローチを採用していますが、カウントされる文字に X が含まれ、数値が数値化されます。
一致を使用したマッチング
ほとんどの正規表現では可変長の後読みは利用できませんが、Java や .NET などの一部のものでは部分的な解決策を提供できます。 。後読みを使用すると、置換結果の長さに依存せずに出現回数を直接カウントできます。
以上が正規表現を使用して、ASCII「画像」内の 3 つの連続する「X」文字の垂直方向の形成をカウントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。