[英]Why does this use, in Java, of regular expressions throw an “Unclosed character class” exception at runtime?
我有关键字列表:
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
^
我怎样才能解决这个问题?
该错误正确地告诉您您要创建的模式无效。 以[Ljava
开头的乱七八糟的字符串是您传递给Pattern.compile()
的字符串。
不幸的是,Java数组没有非常有用的.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 ,
一个字符开头xyz ,
然后是一个空白字符,然后是abc ,
一个字符。
我建议阅读更多有关正则表达式如何工作的信息。 在线上有很多资源可以提供帮助,而Java正则表达式课程和Pattern文档是一个很好的起点-在您了解正则表达式要做什么之前,您不会走得太远。
但是,作为起点,匹配几个单词之一,后跟一个空格,然后是几个其他单词之一的正则表达式可能看起来像这样:
(?:xxxx|yyyy|zzzz)\s(?:aaa|bbb|ccc)
这使用“非捕获组”和逻辑OR运算符|
指定多个潜在的匹配项。
[Ljava.lang.String;@3dd4ab05
是在字符串数组上调用toString()
的结果。
您需要使用相关数组中的项目手动构建模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.