Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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)_Java_Regex - Fatal编程技术网

如何组合两个正则表达式(Java)

如何组合两个正则表达式(Java),java,regex,Java,Regex,我正在对照两个正则表达式检查字符串,如下所示: m = Pattern.compile("((http(s?)://)?)youtu.be/(\\w+)").matcher(word); if (m.find()) { youtubeCodes.add(m.group(4)); } m = Pattern.compile("((((http(s?)://)?)www.)?)youtube.com/watch\\Q?\\Ev=(\\w+)").matcher(word); if (m.fi

我正在对照两个正则表达式检查字符串,如下所示:

m = Pattern.compile("((http(s?)://)?)youtu.be/(\\w+)").matcher(word);
if (m.find()) {
    youtubeCodes.add(m.group(4));
}
m = Pattern.compile("((((http(s?)://)?)www.)?)youtube.com/watch\\Q?\\Ev=(\\w+)").matcher(word);
if (m.find()) {
    youtubeCodes.add(m.group(6));
}

一切都按我所希望的方式运行,但由于表达式如此相似,是否有办法使用|字符将它们组合到一个表达式中。我对正则表达式很陌生,我就是搞不懂它。

在两个正则表达式之间放置一个管道,如下所示:

m = Pattern.compile(
"((((http(s?)://)?)www.)?)youtube.com/watch\\Q?\\Ev=(\\w+)|((http(s?)://)?)youtu.be/(\\w+)"
).matcher(word);

if (m.find()) {
    youtubeCodes.add(m.group(6) == null ? m.group(10) : m.group(6));
}

这样做是可能的。我不确定这样做是否值得,因为结果会非常复杂。无论如何:

  • 步骤1:尽可能使用非捕获组
    (?:)
    ,以便您可以使用相同的表达式检索重要部分:
    (?:(?:http(?:s?)/)?)youtu.be/(\\w+)
    (?:(?:(?:http(?:s?)/)www。)youtube.com/watch\\Q\\Ev=(\\w+)
    都捕获
    m.group(1)
  • 像这样组合它们:
    (?:prefixPattern1 | prefixPattern2)(importantPart)
  • 这是最后的代码:

        String pattern = "(?:(?:(?:http(?:s?)://)?)youtu.be/|(?:(?:(?:(?:http(?:s?)://)?)www.)?)youtube.com/watch\\Q?\\Ev=)(\\w+)";
        m = Pattern.compile(pattern).matcher(word);
        if (m.find()) {
            youtubeCodes.add(m.group(1));
        }
    

    您可以通过查找两个正则表达式中的公共部分来组合它们。这有点棘手,因为在带有“youtu.be”的版本中,您不使用“www.”。如果你觉得有困难,试着画一张图表来直观地看到它。从已有的模式开始,您将得到以下表达式:

     Pattern.compile("((http(s?)://)?)((youtu.be/)|(www.)?youtube.com/watch\\Q?\\Ev=)(\\w+)").matcher(word);
    

    是的,它们可以结合在一起。试着找出共同的部分并重用它们,将不同的部分放在一个组中,并在中间使用
    。请注意,您可能希望将非捕获组(即
    (?:…)
    用于除
    (\\w+)
    之外的所有组-这将使表达式更大,但也将有助于正则表达式引擎(它不需要捕获文本),并将使您的生活更轻松(您只需要一个组,随它去吧(捕获)第1组而不是第6组、第14组或第42组等)。您认为这是@tamas rev’s的更好方法吗?他使用这种方法是为了避免重复http(s?/)部分。还是差异太小而不需要麻烦?这可能是一种更干净的方法,因为您不必处理组数,但不应该对性能产生任何影响