1. ホーム
  2. Web プログラミング
  3. 正規表現

正規性を利用した最後の文字列のマッチング方法

2022-01-17 20:01:56

先日、ある要件に遭遇しました。

<user>
    <user>
        <name>a</name>
    </user>
    <user>
        <name>a</name>
    </user>
</user>
<password>123</password>


取得するための要求

<user>
    <user>
        <name>a</name>
    </user>
    <user>
        <name>a</name>
    </user>
</user>


つまり、最後の </user> の文字列の後にある。

これにはいろいろな方法がありますが、私が最初に思いついたのは、正規のマッチングで </user> の後に文字列が続きます。

最終的に書き出される式は (? <=</user>)(?! [\w\W]*</user>)[\w\W]+ .

でスタート (? <=</user>) で始まるすべての文字にマッチします。 </user> のように、合計3つのポジションがあります。

<イグ

ここで、正規表現 (? <=</user>) は、マッチした位置の前の文字列が </user> ということは、マッチングした位置が </user> の後に

ここで、正規表現の構文である アサーション と呼ばれることもあります。 事前チェック または 見て回る があり、これらはすべて同じように使用されます。次のような構文があります。
(? =pattern) zero-width positive prior assertion (? !pattern) zero-width negative first assertion (? <=pattern) zero-width positive backward assertion (? <!pattern) zero-width negative backward assertion

ここで使われるのは (? <=pattern) で、^ が文字列の先頭、$ が文字列の末尾にマッチするように、ゼロ幅は文字列内の位置にマッチすることを意味します。前方はパターンを満たすこと、後方はパターンの後にマッチすることを意味します。

次に、これらの3つの位置で再度フィルタリングを行うと、これらの3つの位置の違いは、これらの位置の後に、以下のものが続くかどうかであることがわかります。 </user> で、そうでない場合は最後の </user> の位置はその後になります。前の式の後に (?! [\w\W]*? </user>) この時点で、式は次のようになります。 (? <=</user>)(?! [\w\W]*? </user>) .

最後のマッチを得たことがわかります。

ここでの正規表現(? !pattern)はゼロ幅の負の優先順位のアサーションで、パターンの前、後ろからマッチし、マッチした文字列はパターンを満たしてはならないことを意味します。

(?! [\w\W]*? </user>) は、マッチの後に必ず [\w\W]*? </user> \w は英数字とアンダースコアを含む [a-zA-Z0-9_] にマッチし、[^a-zA-Z0-9_] は英数字でもアンダースコアでもなく、両方にマッチすると、任意の文字にマッチするのと同じです。\wW]の後ろの*は0回から何回でもマッチすることを表し、?は遅延モード、つまり条件が満たされたらすぐに戻ることを表します。

最後に、先ほどの正規表現に続いて [\w\W]+ 貪欲なマッチングとは、その位置以降にできるだけ多くの文字列をマッチングさせることです。最後の正規表現は (? <=</user>)(?! [\w\W]*? </user>)[\w\W]*

<イグ

4つの図の最後には、4つのアサーションの違いを簡単に説明しています。

ここで入力された文字列はすべて123456です。

(? =3) で、次の文字が3である位置にマッチします。

(? <=3) で、直前の文字が3である位置にマッチします。

(? !3) 矢印の後の文字が3でないところはマッチしませんが、それ以外の位置はすべてマッチしていることがわかります。

(? <!3) 最初の文字が3でないところでは矢印がマッチせず、それ以外の位置ではマッチしていることがわかります。

概要

この記事は、正規の一致する最後の文字列を使用する方法についてのすべてです、より関連する正規の一致する最後の文字列の内容は、以前の記事を検索してくださいまたは次の関連記事を参照してください、あなたは将来的にもっとスクリプトハウスをサポートしています願っています!.