我有关键字列表:
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
^
我该如何解决这个问题?
答案 0 :(得分:5)
该错误正确地告诉您,您尝试创建的模式无效。以[Ljava
开头的乱码字符串是您传递给Pattern.compile()
的字符串。
.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 lesson和Pattern documentation - 你不会走得太远,直到你明白正则表达式正在尝试要做。
然而,作为一个起点,一个正则表达式匹配几个单词之一,后跟一个空格,后跟几个其中一个单词,可能如下所示:
(?:xxxx|yyyy|zzzz)\s(?:aaa|bbb|ccc)
这使用"非捕获组"和逻辑OR运算符|
指定多个潜在匹配。
答案 1 :(得分:0)
[Ljava.lang.String;@3dd4ab05
是在字符串数组上调用toString()
的结果。
您需要使用相关数组中的项目手动构建模式。