Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式逻辑OR_Java_Regex - Fatal编程技术网

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