1

次の.NET正規表現について考えてみます。

^(REF)?(.{1,10})-(\d{12})-(\d+)$

それは私が興味を持っている4つのグループを定義し、それらを別々に分析します。

ここで、この正規表現の入力文字列について考えてみます。

REFmisc03-123456789012-213

次のように一致させることができます。

(REF)(misc03)-(123456789012)-(213)

そして、次のように一致させることも可能です。

()(REFmisc03)-(123456789012)-(213)

正規表現エンジンがどのように優先するかが文書化されていますか、それともランダムですか?

4

1 に答える 1

2

ランダムではありません。これは、量指定子が正規表現エンジンによってどのように解釈されるか、およびバックトラッキングの可能性に要約されます。数量詞によって、私は?inを参照してい(REF)?ます。MSDNによると

通常、量指定子は貪欲です。正規表現エンジンは、特定のパターンのできるだけ多くの出現に一致します。? を追加 数量詞への文字はそれを怠惰にします。これにより、正規表現エンジンは一致する出現回数をできるだけ少なくします。

つまり、?貪欲で??怠け者です。どちらも 0 回または 1 回一致しますが、一致の実行方法に影響します。

バックトラッキングに関して、MSDN は次のように述べています

正規表現エンジンは、オプションまたは代替部分式を完全に一致させようとします。部分式の次の言語要素に進み、一致が失敗した場合、正規表現エンジンは、正規表現全体を入力と一致させるために、成功した一致の一部を破棄し、以前に保存された状態に戻ることができます。ストリング。一致を見つけるために以前に保存された状態に戻るこのプロセスは、バックトラッキングと呼ばれます。

バックトラッキングの詳細を学ぶためのもう 1 つの有用なリソースは、ここにあります:所有量指定子

あなたの質問に直接答えるために、両方のアプローチを比較できます。

貪欲なアプローチ

元の入力: REFmisc03-123456789012-213

を使用(REF)?すると、テキストが 4 つのグループ (完全に一致する最初のグループを除く) と一致し、すべてのグループが正常に一致します。

  1. 参照
  2. その他03
  3. 123456789012
  4. 213

これは、最初に考えられる一致シナリオ (大まかに定義) と一致します。

(参照)(misc03)-(123456789012)-(213)

部分が 1 ~ 10 文字の長"misc..."さである限り、一致は同じで、1 ~ 10 文字すべてが 2 番目のグループに表示されます。このREF部分は常に最初のグループで一致します。

新しい入力: REF-123456789012-213

その"misc..."部分はありません。(REF)?はオプションであり、そうではないため(.{1,10})、正規表現エンジンは"REF"入力を使用してパターンの後半 (必須) 部分を満たし、前者 (オプション) 部分を無視します。これにより、次のグループ値が得られます。

  1. ""(空の文字列、Successプロパティ = false)
  2. 参照
  3. 123456789012
  4. 213

怠惰なアプローチ

元の入力: REFmisc03-123456789012-213

を使用し(REF)??、パターンの残りの部分を同じに保つと、量指定子が遅延し、次の値を持つ 4 つのグループが返されます。

  1. ""(空の文字列、Successプロパティ = false)
  2. REFmisc03
  3. 123456789012
  4. 213

これは、2 番目に考えられる一致シナリオと一致します。

()(REFmisc03)-(123456789012)-(213)

最初のグループは遅延量指定子ではオプションであるため、正規表現エンジンはそれを無視できます。は 9 文字の長さなので、グループに収まるため"REFmisc03"、エンジンはまとめて処理を進め"REF"ます。"misc03"(.{1,10})

新しい入力: REF-123456789012-213

これは貪欲なパターンと同様に動作し、同じ理由が適用されます。

別の新しい入力: REFmisc0345-123456789012-213

この例では、この"misc0345"部分の長さは 8 文字です。パターンは遅延量指定子を使用しています"REFmisc0345"が、10 文字の制限を超えているため、2 番目のグループに収まりません。"REF"正規表現エンジンは、最初のグループと"misc0345"2 番目のグループでバックトラックして一致します。

  1. 参照
  2. misc0345
  3. 123456789012
  4. 213
于 2012-02-03T17:44:48.877 に答える