0

括弧付きの文字列とエスケープ文字があります。これらの文字と照合し、それらを削除する必要があります。次のコードでは、matches() と replaceAll() を同じ正規表現で使用していますが、matches() は false を返しますが、replaceAll() は問題なく一致しているように見えます。これは、replaceAll() が実行されて文字が削除されるためです。誰か説明できますか?

String input = "(aaaa)\\b";

boolean matchResult = input.matches("\\(|\\)|\\\\[a-z]+");
System.out.printf("matchResult=%s\n", matchResult);

String output = input.replaceAll("\\(|\\)|\\\\[a-z]+", "");
System.out.printf("INPUT: %s --> OUTPUT: %s\n", input, output);

プリントアウト:

matchResult=false
INPUT: (aaaa) --> OUTPUT: aaaa
4

2 に答える 2

5

matches入力の一部ではなく、入力全体に一致します。

正規表現\(|\)|\\[a-z]+は単語全体を表すのではなく、その一部のみを表すため、この場合は失敗します。

于 2012-05-14T06:17:38.230 に答える
2

何をしているのかはBinyamin Sharet によってmatches すでに説明されています。これを少し伸ばしたいと思います。

Java には、他の言語のような "findall" または "g" 修飾子がありません。すべての一致を一度に取得する必要があります。

JavaMatcherクラスは、文字列に対して (置換せずに) パターンを使用する方法を 2 つしか認識していません。

  • matches(): 文字列全体をパターンに一致させます

  • find(): 次の一致を返します

パターンに合うものをすべて取得したい場合はfind()、次のようにループで使用する必要があります。

Pattern p = Pattern
    .compile("\\(|\\)|\\\\[a-z]+");
Matcher m = p.matcher(text);
while(m.find()){
    System.out.println(m.group(0));
}

または、パターンが文字列に存在する場合にのみ関心がある場合

if (m.find()) {
    System.out.println(m.group());
} else {
    System.out.println("not found");
}
于 2012-05-14T06:42:59.687 に答える