matcher.find()有什么问题?

7
String s = "1.01";
Matcher matcher = Pattern.compile("[+-/\\*\\^\\%]").matcher(s);
if (matcher.find()) {
    System.out.println(matcher.group());
}

输入字符串为"1.01",输出为“.”。我不理解为什么matcher.find()返回true,在输入字符串中没有“+”,“-”,“*”,“^”,“%”等符号。这是为什么?


11
matcher.find() 没有问题。 - Sotirios Delimanolis
在字符类中,不需要转义 *^% - fge
2个回答

6
在字符类中,除第一个和最后一个位置的破折号外,其他位置的破折号表示字符范围,例如[a-z]匹配从a到z的所有小写字母,但[-az]仅匹配破折号、a和z。
如果您查看http://www.asciitable.com/,您会发现[+-/]将匹配任何+,-./中的符号。
此外,在正则表达式中,您不需要转义这些符号,特别是在字符类中。如上所述,您的主要问题是字符类中破折号的位置。
您可以从中修复您的正则表达式:
"[+-/\\*\\^\\%]"

为了

"[-+/\\*\\^\\%]"
  ^^

或者不需要不必要的转义:

"[-+/*^%]"

6

我十分确定你需要转义 -。 在字符类中,- 作为范围符号使用,例如在 [0-9] 中。 如果您想查找破折号的示例,则需要转义 -

如果重新排列内部符号,则可以完全使用模式而不需要任何转义。 [-+*^%] 应该有效,并且更容易阅读。


1
字符类中的 + 与重复无关。但是您对于破折号是正确的。 - jlordo
@jlordo 这很有道理,如果在字符类内部转义 +,它会做出任何不同的解析吗? - Walls
不,没有区别。在我的看法中,在字符类内部进行转义会使代码变得不太易读。 - jlordo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接