ホームページ >类库下载 >java类库 >Java 正規表現における Greedy Reluctant Possessive の違い

Java 正規表現における Greedy Reluctant Possessive の違い

高洛峰
高洛峰オリジナル
2016-10-15 13:36:432107ブラウズ

Java の公式ドキュメントhttp://docs.Oracle.com/javase/7/docs/api/java/util/regex/Pattern.html から、量指定子を表す正規表現の記号セットが 3 つあることがわかります。それはGreedy(貪欲)、Reluctant(消極的)、Possessive(独占的)です。意味は次のとおりです:

Java 正規表現における Greedy Reluctant Possessive の違い

貪欲、消極的、独占欲の違い

上の表を見ると、これら 3 つの数量詞の意味は同じであることがわかります (X?、X など)。 ??、X?+ はすべて 1 回か 1 回ではないかを意味します) が、それらの間にはまだ微妙な違いがいくつかあります。最初に例を見てみましょう:

1.Greedy

Rreee -Result:

form 0〜13

2.relecuctant

rreee

result:

0〜4

の一致したフォーム4〜13

3.Possessive

public static void testGreedy() {  
    Pattern p = Pattern.compile(".*foo");  
    String strText = "xfooxxxxxxfoo";  
    Matcher m = p.matcher(strText);  
    while (m.find()) {  
        System.out.println("matched form " + m.start() + " to " + m.end());  
    }  
}

結果:

//不一致に成功しました

原理の説明

貪欲な量指定子は、最初に一致を試みるときにマッチャーが入力文字列全体を読み取ることを強制されるため、「貪欲」と呼ばれます。最初の照合試行が失敗すると、文字は後ろから前へ 1 文字ずつロールバックされ、照合が成功するか頼る文字がなくなるまで照合が再試行されます。

パターン文字列: .*foo

検索文字列: ) 位置。文字列全体が試行されるまで、一度に 1 文字ずつほとんど読み取られません。

パターン文字列: .*foo

検索文字列: xfooxxxxxxfoo

結果: 0 ~ 4 の形式に一致

Java 正規表現における Greedy Reluctant Possessive の違い 4 ~ 13 の形式に一致

比較プロセスは次のとおりです

所有量指定子は常にGreedy とは異なり、Possessive はロールバックすることはなく、ロールバックしたとしても全体的な一致が成功する可能性があります。

パターン文字列: .*foo

検索文字列: xfooxxxxxxfoo

結果:

Java 正規表現における Greedy Reluctant Possessive の違い//正常に一致しませんでした

比較手順は以下の通りです

参考記事: http://docs.oracle.com/ javase /tutorial/essential/regex/quant.html

さらにいくつかの例を見てみましょう:

パターン文字列: .+[0-9]

検索文字列: abcd5aabb6

Java 正規表現における Greedy Reluctant Possessive の違い結果: 0 ~ 10 の形式と一致しました

パターン文字列: .+?[0-9]

検索文字列: abcd5aabb6

結果: 0 ~ 4 の形式に一致しました

パターン文字列: .{1,9}+[0-9]

検索文字列: abcd5aabb6

結果: 0から10の形式に一致

パターン文字列: .{1,10}+[0-9]

検索文字列: abcd5aabb6

結果: 一致に失敗しました


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