【问题标题】:Unclosed Character Class Error?未封闭的字符类错误?
【发布时间】:2014-03-16 00:33:47
【问题描述】:

这是错误:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 3
], [
   ^
    at java.util.regex.Pattern.error(Pattern.java:1924)
    at java.util.regex.Pattern.clazz(Pattern.java:2493)
    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)
    at testJunior2013.J2.main(J2.java:31)

这是导致问题的代码区域。

String[][] split = new String[1][rows];

split[0] = (Arrays.deepToString(array2d)).split("], ["); //split at the end of an array row

这个错误是什么意思,需要做什么来修复上面的代码?

【问题讨论】:

    标签: java regex split


    【解决方案1】:

    TL;DR

    你想要:

    .split("\\], \\[")`
    

    转义每个方括号两次 - 一次用于您需要从其特殊含义中去除它们的每个上下文:首先在Regular Expression内,然后在@内987654322@其次。

    当您需要按字面意思解释您的整个模式时,请考虑使用Pattern#quote


    说明

    String#splitRegular Expression 一起使用,但 [] 不是标准字符,正则表达式:它们在该上下文中具有特殊含义。

    为了去除它们的特殊含义并简单地匹配实际的方括号,它们需要被转义,这是由在每个前面加上一个反斜杠——也就是说,使用\[\]

    但是,在Java String 中,\ 也不是标准字符,也需要转义

    因此,为了拆分[,使用的字符串"\\[",而您正在尝试获取:

    .split("\\], \\[")
    

    明智的选择

    但是,在这种情况下,您不仅仅是在语义上转义正则表达式中的一些特定字符,而是实际上希望您的整个模式都按字面意思解释:有一种方法可以做到这一点?

    Pattern#quote 用于表示:

    模式中的元字符 [...] 不会被赋予特殊含义。

    (来自上面链接的 Javadoc)

    在这种情况下,我建议您使用以下更明智和可读的:

    .split(Pattern.quote("], ["))
    

    【讨论】:

    • 这正是我正在寻找的答案,谢谢。在什么情况下我应该使用Pattern.quote 而不是标准的.split("\\], [\\")
    • 你“应该”总是使用Pattern.quote,因为它相当于自己转义正则表达式字符串......但是使用它,你确定你不会忘记任何东西,除此之外,它是在我看来,更具可读性:)
    【解决方案2】:

    Split 接收一个正则表达式,并且 [, ] 字符在正则表达式中有意义,因此您应该使用 \\[\\] 转义它们。

    按照您当前的操作方式,解析器会发现 ] 前面没有 [ 所以它会抛出该错误。

    【讨论】:

      【解决方案3】:

      String.split() 采用正则表达式,而不是普通字符串作为参数。在正则表达式中,] 和 [ 是特殊字符,需要在前面加上反斜杠才能按字面意思理解。使用.split("\\], \\[")。 (双反斜杠告诉 Java 将字符串解释为“\]、\[”)。

      【讨论】:

        【解决方案4】:
          .split("], [")
                     ^---start of char class
                          end----?
        

        改成

        .split("], \[")
                   ^---escape the [
        

        【讨论】:

        • 对不起,您能详细说明一下吗?
        • 在 SO 上提交解决方案之前最好先尝试一下解决方案;)请记住,这个问题是关于 Java 的
        【解决方案5】:

        尝试使用它

         String stringToSplit = "8579.0,753.34,796.94,\"[784.2389999999999,784.34]\",\"[-4.335912230999999, -4.3603307895,4.0407909059, 4.08669583455]\",[],[],[],0.1744,14.4,3.5527136788e-15,0.330667850653,0.225286999939,Near_Crash";
         String [] arraySplitted = stringToSplit.replaceAll("\"","").replaceAll("\\[","").replaceAll("\\]","").trim().split(",");
        

        【讨论】:

          猜你喜欢
          • 2018-04-01
          • 1970-01-01
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 2022-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多