Youtube完整的Java正则表达式教程

11

我需要解析多个页面以获取它们的所有Youtube ID。

我在网上找到了许多正则表达式,但是Java正则表达式不完整(它们要么给我除ID之外的垃圾,要么会错过一些ID)。

我发现一个看起来很完整的正则表达式托管在这里。但它是用JavaScript和PHP编写的。不幸的是,我无法将它们翻译成JAVA。

有人能帮我将这个PHP正则表达式或以下JavaScript正则表达式改写成Java吗?

'~
    https?://         # Required scheme. Either http or https.
    (?:[0-9A-Z-]+\.)? # Optional subdomain.
    (?:               # Group host alternatives.
      youtu\.be/      # Either youtu.be,
    | youtube\.com    # or youtube.com followed by
      \S*             # Allow anything up to VIDEO_ID,
      [^\w\-\s]       # but char before ID is non-ID char.
    )                 # End host alternatives.
    ([\w\-]{11})      # $1: VIDEO_ID is exactly 11 chars.
    (?=[^\w\-]|$)     # Assert next char is non-ID or EOS.
    (?!               # Assert URL is not pre-linked.
      [?=&+%\w]*      # Allow URL (query) remainder.
      (?:             # Group pre-linked alternatives.
        [\'"][^<>]*>  # Either inside a start tag,
      | </a>          # or inside <a> element text contents.
      )               # End recognized pre-linked alts.
    )                 # End negative lookahead assertion.
    [?=&+%\w]*        # Consume any URL (query) remainder.
    ~ix'
/https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:['"][^<>]*>|<\/a>))[?=&+%\w]*/ig;

为什么可选子域不允许小写字母?您可能需要将该部分更改为 ...[0-9A-Za-z-]... - eykanal
@eykanal 这里使用了 i 标志。 - Marcus
1
@Marcus - 啊,好的发现,我没有在正则表达式中往后读那么远。 - eykanal
2个回答

21

首先,您需要为旧的正则表达式中的每个反斜杠\插入一个额外的反斜杠,否则Java会认为您在字符串中转义了其他特殊字符,而您并没有这样做。

https?:\\/\\/(?:[0-9A-Z-]+\\.)?(?:youtu\\.be\\/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|<\\/a>))[?=&+%\\w]*

接下来,当您编译模式时,需要添加CASE_INSENSITIVE标志。以下是一个示例:

String pattern = "https?:\\/\\/(?:[0-9A-Z-]+\\.)?(?:youtu\\.be\\/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|<\\/a>))[?=&+%\\w]*";

Pattern compiledPattern = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher matcher = compiledPattern.matcher(link);
while(matcher.find()) {
    System.out.println(matcher.group());
}

这个正则表达式中的哪个子匹配组包含视频代码? - SeanPONeil
你的正则表达式中有一些多余的转义字符,这是没有它们的版本:https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w](?:['"][^<>]>|</a>))[?=&+%\w]* - Josh Hibschman
它对于此URL `https://www.youtube.com/embed/lwnIuosYGZo' 不起作用。 - Ashu

3

Marcus提供的正则表达式很好,但我发现它不能识别没有"http(s)"的"www"的YouTube链接,例如www.youtube....

我有一个更新:

^(?:https?:\\/\\/)?(?:[0-9A-Z-]+\\.)?(?:youtu\\.be\\/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|<\\/a>))[?=&+%\\w]*

除了开头外,它们是一样的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接