是 – *在正则表达式中有任何特殊含义吗?
我有字符串:
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. -*
有特殊意义吗?
它确实如此,但不是在角色类中。 在字符类之外,这意味着匹配连字符,零次或多次 。