matcher.find()有什么问题?

igo*_*upa 7 java regex

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

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

jlo*_*rdo 6

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

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

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

"[+-/\\*\\^\\%]"
Run Code Online (Sandbox Code Playgroud)

"[-+/\\*\\^\\%]"
  ^^
Run Code Online (Sandbox Code Playgroud)

或者没有不必要的逃避:

"[-+/*^%]"
Run Code Online (Sandbox Code Playgroud)


Wal*_*lls 6

我很确定你必须逃脱-. -用作字符类中的范围符号,如in [0-9].的-,如果你想找到破折号的例子进行转义需求.

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