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

JmG*_*JmG 1 java regex pattern-matching

我有关键字列表:

String[] keywords = {"xxxx", "yyyy", "zzzz"};
String[] another = {"aaa", "bbb", "ccc"};
Run Code Online (Sandbox Code Playgroud)

我正在尝试识别其中一个关键字后面跟一个空格然后跟着一个"另一个"字的文本.

如果我使用:

Pattern pattern = Pattern.compile(keywords+"\\s"+another);
Run Code Online (Sandbox Code Playgroud)

这会在运行时抛出异常:

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

我怎样才能解决这个问题?

dim*_*414 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());
Run Code Online (Sandbox Code Playgroud)
[xxxx, yyyy, zzzz]\s[aaa, bbb, ccc]
Run Code Online (Sandbox Code Playgroud)

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

我建议阅读更多有关正则表达式如何工作的内容; 有很多在线资源可供帮助,一个很好的起点是Java正则表达式课程模式文档 - 在理解正则表达式尝试做什么之前,你不会走得太远.

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

(?:xxxx|yyyy|zzzz)\s(?:aaa|bbb|ccc)
Run Code Online (Sandbox Code Playgroud)

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