Java字符串匹配项和替换项在匹配括号中有所不同

Java字符串匹配项和替换项在匹配括号中有所不同,java,regex,Java,Regex,我有带括号的字符串和转义字符。我需要匹配这些字符并删除它们。在下面的代码中,我使用了具有相同正则表达式的matches和replaceAll,但是匹配返回false,而replaceAll似乎匹配得很好,因为replaceAll执行并删除字符。有人能解释一下吗 String input = "(aaaa)\\b"; boolean matchResult = input.matches("\\(|\\)|\\\\[a-z]+"); System.out.printf("matchResult=

我有带括号的字符串和转义字符。我需要匹配这些字符并删除它们。在下面的代码中,我使用了具有相同正则表达式的matches和replaceAll,但是匹配返回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
匹配整个输入,而不是其中的一部分

正则表达式\ \ \ \ \ \ \[a-z]+不能描述整个单词,而只能描述其中的一部分,因此在您的例子中,它失败了。

匹配项所做的工作已经完成。我想扩展一下

Java没有findall或g修饰符,就像其他语言一样,它可以一次获得所有匹配项

Java Matcher类只知道两种方法可以对字符串使用模式而不替换它

:根据模式匹配整个字符串

:返回下一个匹配项

如果你想得到所有符合你模式的东西,你需要使用循环中的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");
}

它应该在注释中,而不是在回答中。@BhavikAmbani-我不同意,这就是为什么replaceAll工作时匹配失败的解释。@BhavikAmbani:这绝对是一个答案。问题是为什么matches的行为与replaceAll不同,答案很简单,replaceAll正在替换部分输入,而matches匹配整个输入。在什么方面它不是一个答案?如果它建议对代码进行修复,它将是一个更好的答案。@stackoverflowuser2010-对于不同的问题,它将是一个更好的答案。我看不到有人要求这样做。此外,修复非常简单。我将匹配的原始代码更改为以下代码,在每个模式的开头和结尾添加了。*:inputString.matches.*.\..\\\[a-z]+.*。现在它匹配了子字符串,这就是我真正想要的。我不想在这么简单的任务中使用Pattern和Matcher。你听起来好像很清楚自己在说什么。很高兴能帮助你。