我有这段代码:
public static void main(String[] args) {
String et1 = "test";
String et2 = "test";
et1.matches("[-+*/]"); //works fine
et2.matches("[+-*/]"); //java.util.regex.PatternSyntaxException, why?
}
因为' - '逃避性格?但是,如果' - '切换为' +' ?
答案 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