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

输入字符串为“1.01”,输出为“.”。我不明白为什么 matcher.find() 返回 true,输入字符串中没有“+”、“-”、“*”、“^”、“%”等符号。为什么会这样?

4

2 回答 2

6

字符类中除第一个或最后一个位置之外的任何其他位置的破折号表示一个字符范围,就像[a-z]匹配从 a 到 z 的每个小写字母一样,但[-az]仅匹配破折号、a 和 z。如果您查看http://www.asciitable.com/,您会发现它[+-/]匹配任何+,-./

此外,您不必在正则表达式中转义这些符号,尤其是在字符类中。如前所述,您的主要问题是破折号在字符类中的位置。

你可以修复你的正则表达式

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

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

或没有不必要的转义:

"[-+/*^%]"
于 2013-05-29T17:52:33.347 回答
6

我很确定你必须逃跑--用作字符类中的范围符号,如 in [0-9]。如果您想查找破折号的-示例,则需要转义。

如果你对里面的符号重新排序,你可以摆脱整个模式而没有任何转义。 [-+*^%]应该可以工作并且更容易阅读。

于 2013-05-29T17:54:34.200 回答