是 – *在正则表达式中有任何特殊含义吗?

我有字符串:

String str = Hello+Bye-see*Go/ok 

现在,我想基于+-*/进行拆分。 所以我做了:

 str.split("[+-*/]"); 

但这失败了,抛出一个错误:

 Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal character range near index 3 [+-*/] ^ at java.util.regex.Pattern.error(Pattern.java:1924) at java.util.regex.Pattern.range(Pattern.java:2594) at java.util.regex.Pattern.clazz(Pattern.java:2507) at java.util.regex.Pattern.sequence(Pattern.java:2030) at java.util.regex.Pattern.expr(Pattern.java:1964) at java.util.regex.Pattern.compile(Pattern.java:1665) at java.util.regex.Pattern.(Pattern.java:1337) at java.util.regex.Pattern.compile(Pattern.java:1022) at java.lang.String.split(String.java:2313) at java.lang.String.split(String.java:2355) 

然后我将正则表达式更改为:

 str.split("[-+*/]"); 

它工作得很好! 所以我想知道-*是否有任何特殊含义? 我在正则表达式[+-*/]做错了什么?

A.错误在哪里?

问题不在于-* 。 问题是在[character class] ,连字符-具有特殊含义。 例如,在[az] ,它表示从a到z的所有字符 。 因此,当你的字符类中有+-*时,我们正在寻找从+ (ASCII 43)到* (ASCII 42)的字符。 无效,因此错误。 从技术上讲,正如@Pshemo在评论中所写,Java不使用基于ASCII但基于Unicode表的字符索引。 但由于128个第一个ASCII字符点在Unicode中是相同的,因此结果是相同的。

你需要像这样\-来逃避连字符\-或者,正如你所观察到的,抛出-在你的类的前面(或后面),它不表示字符范围:

 [-+*/] 

因此,在拆分中(使用“后面”版本的变化):

 String[] result = your_original_string.split("[+*/-]"); 

B.但是[*-+]会有效! (ASCII 42到43)

如果反转+* ,则有一个有效的ASCII范围(42到43)。 当然没有必要这样做,因为(i)中间没有人物,(ii)会让我的狗感到困惑。

C. -*有特殊意义吗?

它确实如此,但不是在角色类中。 在字符类之外,这意味着匹配连字符,零次或多次