Java正则表达式逻辑OR
我试图匹配给定字符串中一组短语中的任何或全部。这是我的正则表达式:Java正则表达式逻辑OR,java,regex,Java,Regex,我试图匹配给定字符串中一组短语中的任何或全部。这是我的正则表达式: (^|\\W)(" + phrase1 + "|" + phrase2 + "|" + phrase3 + ... ")(\\W|$) 我需要能够匹配任何数量的短语,我是或ing。除了两个短语紧挨着出现外,它似乎工作正常。因此“phrase1-lorem-ipsum phrase2-lorem-ipsum”匹配phrase1和phrase2,但“phrase1-phrase2-lorem-ipsum”仅匹配phrase1(因此
(^|\\W)(" + phrase1 + "|" + phrase2 + "|" + phrase3 + ... ")(\\W|$)
我需要能够匹配任何数量的短语,我是
或ing。除了两个短语紧挨着出现外,它似乎工作正常。因此“phrase1-lorem-ipsum phrase2-lorem-ipsum”
匹配phrase1和phrase2,但“phrase1-phrase2-lorem-ipsum”
仅匹配phrase1(因此“phrase1.phrase2-lorem-ipsum”
)。如果短语1和短语2之间有多个非单词字符(例如,两个或多个空格),那么它也会匹配这两个字符。我做错了什么?这是因为您的regexp两边都有\\W
。也就是说,第一个非单词字符与第一个匹配匹配,然后第二个匹配需要一个以上的非单词字符。我怀疑您的目的是:
List<String> findPhrases(String s, String... phrases) {
return findPhrases(s, Arrays.asList(phrases));
}
List<String> findPhrases(String s, Collection<String> phrases) {
if (phrases.size() < 1) {
throw new IllegalArgumentException("must specify at least one phrase");
}
StringBuilder sb = new StringBuilder();
Iterator<String> iter = phrases.iterator();
String first = iter.next();
sb.append(first);
while (iter.hasNext()) {
sb.append("|");
sb.append(iter.next());
}
Pattern p = Pattern.compile("\\b(" + sb.toString() + ")\\b");
Matcher m = p.matcher(s);
List<String> ret = new ArrayList<String>();
while (m.find()) {
ret.append(Pattern.quote(m.group(1)));
}
return ret;
}
这更容易阅读
(2) 可以通过引用短语来处理。我已经修改了上面的代码,调用Pattern.quote()
来引用任何正则表达式特殊字符。这正是我所做的。但是,如果短语的开头或结尾包含括号,就会产生问题。这就是我改用\W的原因。如果短语包含括号,则需要准确定义短语是什么以及它们的界限。\b…。\b
即使在转义短语中的任何特殊字符后也不起作用。这是我更新的正则表达式,它似乎可以工作(^code>)(^b\\\b\\\W)(“+ORedPhrases+”)(\\W\$)“
为什么不跳过括号?
<?<=\W|^)...(?=\W|$)
\b...\b