0

我有带括号的字符串和转义字符。我需要匹配这些字符并删除它们。在下面的代码中,我使用具有相同正则表达式的 match() 和 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类只知道对字符串使用模式的两种方法(不替换它)

  • 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 回答