为什么在Java中使用正则表达式会在运行时抛出“Unclosed character class”异常?

时间:2014-05-06 03:43:46

标签: java regex pattern-matching

我有关键字列表:

String[] keywords = {"xxxx", "yyyy", "zzzz"};
String[] another = {"aaa", "bbb", "ccc"};

我正在尝试识别其中一个关键字后跟一个空格,然后是其中一个"另一个"词语的

如果我使用:

Pattern pattern = Pattern.compile(keywords+"\\s"+another);

这会在运行时抛出异常:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 57
[Ljava.lang.String;@3dd4ab05\s[Ljava.lang.String;@5527f4f9
                                                         ^

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

该错误正确地告诉您,您尝试创建的模式无效。以[Ljava开头的乱码字符串是您传递给Pattern.compile()的字符串。

遗憾的是,Java Arrays没有非常丰富的.toString()输出,你在这里做的基本上是将两个数组连接成字符串,Pattern无法正确解析。

但即使您致电Arrays.toString(),您仍然无法获得您正在寻找的内容:

Pattern pattern=Pattern.compile(Arrays.toString(keywords)+"\\s"+
                                Arrays.toString(another));
System.out.println(pattern.pattern());
[xxxx, yyyy, zzzz]\s[aaa, bbb, ccc]

这是一个技术上有效但基本无意义的正则表达式,它只匹配三个字符的字符串,从xyz ,中的一个字符开始,后跟一个空白字符,后跟abc ,中的一个字符。

我建议阅读更多有关正则表达式如何工作的内容;有很多在线资源可供帮助,一个很好的起点是Java Regular Expressions lessonPattern documentation - 你不会走得太远,直到你明白正则表达式正在尝试要做。

然而,作为一个起点,一个正则表达式匹配几个单词之一,后跟一个空格,后跟几个其中一个单词,可能如下所示:

(?:xxxx|yyyy|zzzz)\s(?:aaa|bbb|ccc)

这使用"非捕获组"和逻辑OR运算符|指定多个潜在匹配。

答案 1 :(得分:0)

[Ljava.lang.String;@3dd4ab05是在字符串数组上调用toString()的结果。

您需要使用相关数组中的项目手动构建模式。