当前位置: 首页 > 面试题库 >

-*在正则表达式中是否有特殊含义?

秦奇
2023-03-14
问题内容

我的字符串为:

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.<init>(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("[-+*/]");

而且效果很好!所以我想知道是否-*有什么特殊含义?我在正则表达式中做错了[+-*/]什么?


问题答案:

答:错误在哪里?

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

您需要像这样逃避连字符,\-或者如您所见,将-_放在类的前面(或后面),在该地方不表示字符范围:

[-+*/]

因此,将其拆分(使用“ at at the back”版本作为变体):

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

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

如果反转+*,则具有有效的ASCII范围(42到43)。当然,这样做是没有意义的,因为(i)中间没有字符,并且(ii)会使我的狗迷惑。

C.-*有特殊含义吗?

可以,但不能在角色类中。在字符类之外,这意味着 匹配连字符零次或多次



 类似资料:
  • 我有一个带两个可能输出的字符串,它将被<代码>

  • 问题内容: 我正在寻找符合以下规则的正则表达式。 允许的字符 字母:az / AZ 数字:0-9 特殊字符:〜@#$ ^&*()-_ + = [] {} | \,。?:( 应允许使用空格) 不允许 特殊字符:<>’“ /;`% 问题答案: 对于允许的字符,您可以使用 验证应仅由允许的字符组成的完整字符串。请注意,在结尾处(否则将是一个范围),并且转义了几个字符。 对于无效字符,您可以使用 检查他们

  • 问题内容: Java或任何开放源代码库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式? 动态构建正则表达式非常方便,而不必手动转义每个字符。 例如,考虑一个简单的正则表达式,它匹配带小数点的数字,例如,以及以下代码: 毫不奇怪,以上代码产生的输出是: 也就是说,匹配项(但是“动态”构建的)不匹配(相反,它与文字字符串匹配)。 那么,有没有一种方法可以自动转义每个正则表

  • 我试图为密码字段创建一个验证,它只允许字符和 时有什么区别,以及哪些字符来自

  • 问题内容: 我想编写一个简单的正则表达式来检查给定字符串中是否存在任何特殊字符。我的正则表达式可以工作,但是我不知道为什么它还包括所有数字,所以当我输入一些数字时会返回错误。 我的代码: 问题答案: 请不要那样做…… 像这样的小Unicode BABY ANGEL 快要死了!◕◡◕(←这些不是图像)(箭头也不是!) 而且您正在杀死20年的DOS:-)(最后一个笑脸称为WHITE SMILING F

  • Java 或任何开源库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式? 这在动态构建正则表达式时非常方便,而无需手动转义每个单独的字符。 例如,考虑一个简单的正则表达式,如 \d \.,它匹配小数点()的数字,以及以下代码: 毫不奇怪,上述代码产生的输出是: 也就是说,匹配但(它是“动态”构建的)不匹配(相反,它匹配文字字符串)。 那么,有没有一种方法可以自动转义每个