1

次のコードを理解しようとしています。

Pattern.compile("(.*?):")

私はすでにそれが何を意味するのかについていくつかの調査を行いましたが、私はそれをよく理解していません:

Java ドキュメントによると、* は 0 回以上を意味し、? 一度またはまったく意味しません。

また、「:」はどういう意味ですか?

ありがとう

4

4 に答える 4

5

これは、消極的な数量詞と呼ばれます。アスタリスクと疑問符は*?一緒に、「入力から必要以上の文字を一致させずに、ゼロ回以上」を意味します。これにより、ドット.式が入力の後続のコロンと一致しなく:なります。

[^:]*:バックトラックを回避できるため、同じシーケンスに一致するより適切な表現はです。理由を説明する記事へのリンクを次に示します。

于 2012-09-03T13:28:22.453 に答える
4

or?などの貪欲な演算子の後は、演算子を非貪欲にします。がなければ、その正規表現は、. を含む、見つかったすべての文字と一致し続けます。+*?:

このままでは、正規表現はセミコロン ( :) の前にあるすべての文字列に一致します。この場合、セミコロンは特殊文字ではありません。セミコロンの前にあるものはグループにスローされ、後でMatcherオブジェクトを介してアクセスできます。

このコード スニペットは、うまくいけば物事をより明確にします。

    String str = "Hello: This is a Test:";
    Pattern p1 = Pattern.compile("(.*?):");
    Pattern p2 = Pattern.compile("(.*):");
    
    Matcher m1 = p1.matcher(str);
    if (m1.find())
    {
        System.out.println(m1.group(1));            
    }
    
    Matcher m2 = p2.matcher(str);
    if (m2.find())
    {
        System.out.println(m2.group(1));
    }

収量:

こんにちは

こんにちは: これはテストです

于 2012-09-03T13:28:18.087 に答える