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

黄舟
リリース: 2017-01-20 11:10:58
オリジナル
1599 人が閲覧しました

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

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

出力:

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)。


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