ホームページ > バックエンド開発 > PHPチュートリアル > 正規表現を使用して ASCII 画像の縦線の数をカウントできますか?

正規表現を使用して ASCII 画像の縦線の数をカウントできますか?

Susan Sarandon
リリース: 2024-11-07 22:01:03
オリジナル
935 人が閲覧しました

 Can Regular Expressions Be Used to Count Vertical Line Formations in ASCII Images?

正規表現を使用した ASCII 画像の垂直パターンのマッチング

ASCII 画像またはマップを分析する状況では、次のような状況が発生することがあります。特定のパターンを特定することが必要になります。そのようなパターンの 1 つは、3 つの X の縦線形成です。正規表現を使用すると、このタスクに効果的に取り組むことができます。

質問 1: 垂直線形成の存在を判断する

垂直線が存在するかどうかを判断するには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 が出現する前の各行の文字数をカウントします。パターンが検出された場合、式は正常に一致します。

質問 2: 垂直線形成の発生数をカウントする

ただし、正規表現を使用した直接一致は提供できません。後読み機能が限られているため、垂直線形成の正確なカウントを得るには、間接的な解決策が存在します。

次の式のすべての一致を $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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート