为什么string.matches [" + - * /"]会报告模式异常?

时间:2014-03-12 02:25:27

标签: java regex

我有这段代码:

public static void main(String[] args) {
       String et1 = "test";
       String et2 = "test";
       et1.matches("[-+*/]"); //works fine
       et2.matches("[+-*/]"); //java.util.regex.PatternSyntaxException, why?
}

因为' - '逃避性格?但是,如果' - '切换为' +' ?

4 个答案:

答案 0 :(得分:4)

这是因为-用于定义字符类中的一系列字符。由于+在ascii表中位于*之后,因此范围无意义,并且您获得了错误。

要在字符类的中间放置文字-,您必须将其转义。如果-在课程的开始或结束时没有问题,因为它是不明确的。

您之前不需要转义-的另一种情况是您之前有一个字符类快捷方式,例如:

[\\d-abc]  

(像pcre这样的其他正则表达式引擎在[abc-\d]之后放置字符类快捷方式时允许相同,但Java似乎不允许这样做。)

答案 1 :(得分:3)

字符类(-)内的

[xxx]用于定义范围,例如:[a-z]用于所有小写字符。如果你想真正意味着“破折号”,它必须处于第一或最后位置。我通常把它放在第一位以避免任何混淆。

或者你可以逃脱它:[+\\-*/]

答案 2 :(得分:0)

仅供参考,Java正则表达式元字符定义为here

The metacharacters supported by this API are: <([{\^-=$!|]})?*+.>

作为一般规则,为了避免使用正则表达式调试问题,如果我想将这些字符中的任何一个用作文字,那么我在它们之前加上一个\(或者在Java字符串表达式中的\或\)。

或者:

et2.matches("[\\+\\-\\*/]");

或者:

et2.matches("[\\-\\+\\*/]");

无论订单如何都能正常工作。

答案 3 :(得分:0)

我认为你应该使用:[\ - \ + \ * /] 因为:&#39; - &#39;定义范围,例如:[a-d]它的意思是:a,b,c,d