matcher.find()有什么问题?

时间:2013-05-29 17:49:38

标签: java regex

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

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

2 个答案:

答案 0 :(得分:6)

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

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

您可以从

修复正则表达式
"[+-/\\*\\^\\%]"

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

或没有不必要的逃避:

"[-+/*^%]"

答案 1 :(得分:6)

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

如果你对里面的符号进行重新排序,你就可以摆脱整个模式而不会有任何遗漏。 [-+*^%]应该有效并且更容易阅读。