Java matcher.find()有什么问题?
输入字符串为“1.01”,输出为“.”。我不明白为什么matcher.find()返回true,因为输入字符串中没有像“+”、“-”、“*”、“^”和“%”这样的符号。为什么会发生这种情况?字符类中除第一个或最后一个以外的任何其他位置的破折号表示字符范围,就像Java matcher.find()有什么问题?,java,regex,Java,Regex,输入字符串为“1.01”,输出为“.”。我不明白为什么matcher.find()返回true,因为输入字符串中没有像“+”、“-”、“*”、“^”和“%”这样的符号。为什么会发生这种情况?字符类中除第一个或最后一个以外的任何其他位置的破折号表示字符范围,就像[a-z]匹配从a到z的每个小写字母一样,但是[-az]只匹配破折号、a和z。 如果您查看,您将看到[+-/]将匹配+,-./ 此外,您不必在正则表达式中转义这些符号,尤其是在字符类中。如前所述,您的主要问题是破折号在角色类中的位置 您可以
[a-z]
匹配从a到z的每个小写字母一样,但是[-az]
只匹配破折号、a和z。
如果您查看,您将看到[+-/]
将匹配+,-./
此外,您不必在正则表达式中转义这些符号,尤其是在字符类中。如前所述,您的主要问题是破折号在角色类中的位置
您可以从中修复正则表达式
String s = "1.01";
Matcher matcher = Pattern.compile("[+-/\\*\\^\\%]").matcher(s);
if (matcher.find()) {
System.out.println(matcher.group());
}
到
或者没有不必要的逃避:
"[-+/\\*\\^\\%]"
^^
我很确定你必须逃出
-
<代码>-在字符类中用作范围符号,如[0-9]
。如果要查找破折号示例,则需要转义-
如果你重新排列里面的符号,你可以在没有任何转义的情况下处理整个图案
[-+*^%]
应该可以工作,而且更容易阅读。matcher.find()没有问题。在字符类中不需要转义*
、^
或%
字符类中的+
与重复无关。但是你对破折号的看法是对的。@jlordo这很有意义,如果+
在字符类中转义,那么破折号在解析时会有什么不同吗?不,没有区别。IMHO字符类内的转义会降低代码的可读性。
"[-+/\\*\\^\\%]"
^^
"[-+/*^%]"