" と一致しますが、実際の結果は "aava " と一致します。 の使用法を見てみましょう。貪欲モードの詳細。"/> " と一致しますが、実際の結果は "aava " と一致します。 の使用法を見てみましょう。貪欲モードの詳細。">

ホームページ  >  記事  >  Java  >  Java プログラムにおける正規表現の貪欲パターン マッチングの分析例

Java プログラムにおける正規表現の貪欲パターン マッチングの分析例

黄舟
黄舟オリジナル
2017-01-20 11:10:581560ブラウズ

Greedy モードは最大一致とも呼ばれます。X?, ;abb"、おそらく期待される結果は "a34de1251f0d9fe1e645927f19a896e8" と一致しますが、実際の結果は "a34de1251f0d9fe1e645927f19a896e8aava fd273fcf5bcad3dfdad3c41bd81ad3e5" と一致します。貪欲モードの詳細を見てみましょう。

貪欲モード (Greedy):

特に指定がない限り、数量インジケーターはデフォルトで貪欲モードになります。 Greedy モードの式は、一致するものが見つからなくなるまで一致し続けます。式の一致結果が期待どおりではないことがわかった場合、その理由として最も可能性が高いのは、式が最初の数文字のみに一致すると思っていたが、実際には貪欲なパターンであるため、引き続き一致することです。
貪欲と非貪欲、および非貪欲のための ? :

var s = '1023000'.match(/(\d+)(0*)/);
s
["1023000", "1023000", ""]
 
var s = '1023000'.match(/^(\d+)(0*)$/);
s
["1023000", "1023000", ""]
 
var s = '1023000'.match(/^(\d+?)(0*)$/);
s
["1023000", "1023", "000"]
 
var s = '1023000'.match(/(\d+?)(0*)/);
s
["10", "1", "0"]

java 039e26ff66f1019cd15a186dfc2e5600aspku.com/kaifa/zhengze/" target="_blank">デフォルトの正規表現は次のとおりです。貪欲な貪欲マッチング モードは、このタイプの最長一致 (.*) です。最短一致が必要な場合は、消極的マッチング モードである (.*?) に変更されます。
原理分析:
欲張りマッチングモードの場合、正規表現エンジンは、一致が false の場合、
バックトラッキングを通じて最後から 2 番目の一致位置を後方に検索し、一致した結果を返します。パターンにかろうじて一致するために、正規表現エンジンはパターンの終了位置に一致する文字と一致し、次に 1 ステップ戻って一致が false であることを確認し、その後バックトラックしてフォールバック一致が存在する最後の位置を見つけます。 true の場合は結果を返します。
コードを見てください:
例1:

public void test51(){ 
  String str = "aaa\"bbb\"ccc\"ddd\"eee"; 
  System.out.println(str); 
  str = str.replaceAll("\"(.*)\"", "@"); 
  System.out.println(str); 
}

出力:

aaa"bbb"ccc"ddd"eee
aaa@eee

例2:

@Test 
 public void test52(){ 
   String str = "aaa\"bbb\"ccc\"ddd\"eee"; 
   System.out.println(str); 
     
   str = str.replaceAll("\"(.*?)\"", "@"); 
   System.out.println(str); 
     
 }

出力:

aaa"bbb"ccc"ddd"eee
aaa@ccc@eee

上記は、分析例のためのJavaプログラムの正規表現の貪欲パターンマッチングの内容です。その他の関連コンテンツにも注目してください。PHP 中国語 Web サイト (www.php.cn)。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。