java - 未封闭的字符类错误?

标签 java regex split

这里是错误:

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

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

最佳答案

长话短说

你想要:

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

转义每个方括号两次 — 对于每个您需要从其特殊含义中剥离它们的上下文:在 Regular Expression 中首先,在 Java String 内其次。

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


说明

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

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

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

因此,仅在 [ 上拆分,使用的 String"\\[" 并且您正试图获得:

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

一个明智的选择

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

Pattern#quote用于表示:

Metacharacters [...] in your pattern will be given no special meaning.

(来自上面链接的 Javadoc)

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

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

关于java - 未封闭的字符类错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21816788/

相关文章:

java - JSP请求中的属性变为0

php - 如何避免 substr() 破坏 html 标签?

regex - 为什么这个正则表达式有效?

java - 拆分一个字节数组...?

python - 嵌套 NumPy 数组并使用拆分等方法

java - 引用一个在编译时无法解析的变量。 (java)

java - 谁拥有 Java Swing 可滚动视口(viewport)的边缘颜色?

java - 了解媒体扫描仪何时完成工作

ios - 正则表达式搜索效率

python - 对字符串进行切片并返回拼接后的字符串