1

私が走るとき:

String line = "  test";
Pattern indentationPattern = Pattern.compile("^[\\s]+");
Matcher indentationMatcher = indentationPattern.matcher(line);

if (indentationMatcher.matches()) {
    System.out.println("Got match!");

    int indent = indentationMatcher.group(0).length();
    System.out.println("Size of match: " + indent);
} else {
    System.out.println("No match! :(");
}

一致しません。ここで何が起きてるの?私はhttp://www.regexplanet.com/advanced/java/index.htmlで正規表現をオンラインでテストしました。これはJavaで正規表現をテストするために特別に設計されているようです。

4

3 に答える 3

6

いくつか変更しました。コメントを参照してください。

String line = "  test";
Pattern indentationPattern = Pattern.compile("^(\\s+)"); // changed regex
Matcher indentationMatcher = indentationPattern.matcher(line);

if (indentationMatcher.find()) {   // used find() instead of matches()
    System.out.println("Got match!");

    int indent = indentationMatcher.group(1).length(); // group 1 instead of 0
    System.out.println("Size of match: " + indent);
} else {
    System.out.println("No match! :(");
}

出力:

Got match!
Size of match: 2

上記の変更の理由:

find()入力でパターンを見つけようとし、true見つかったときに与えます。while (matcher.find()) { ... }入力からすべての一致を検索するように、複数回使用することもできます。

matches()完全な入力をパターンと一致させようとし、完全trueな入力が正規表現と一致する場合にのみ提供します。

パターン全体はグループ0で、最初のキャプチャグループの内容はグループ1です。この場合、キャプチャグループの外側には、長さ/幅が0()の行の先頭のみがあるため、違いはありません。^

于 2013-02-21T16:04:00.677 に答える
1

Matcher.matches()文字列全体を一致させようとしますが、パターンはスペースのみと一致し、他には何も一致しません。試す

Pattern indentationPattern = Pattern.compile("(\\s+).*")

代わりは。パターンが一致する場合group(1)、先頭の空白が含まれます。残りのキャラクターにも興味がある場合は、別のキャプチャグループを追加する必要があります。

于 2013-02-21T16:12:20.120 に答える
1

Matcher#matches 指定されたパターンを自動アンカーします。これは、まず、パターン"^[\\s]+"とまったく同じであることを意味"[\\s]+"します。したがって、入力に一致させるには、を使用します"[\\s]+.*"

于 2013-02-21T16:03:34.303 に答える