Youtube 完整的 Java 正则表达式

Posted

技术标签:

【中文标题】Youtube 完整的 Java 正则表达式【英文标题】:Youtube complete Java Regex 【发布时间】:2011-12-15 05:38:36 【问题描述】:

我需要解析几个页面来获取他们所有的 Youtube ID。

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

我发现似乎完整的一个托管在here。但它是用 javascriptphp 编写的。不幸的是,我无法将它们翻译成 JAVA。

有人可以帮我用 Java 重写这个 PHP 正则表达式或下面的 JavaScript 吗?

'~
    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 它使用i 标志。 @Marcus - 啊,很好,在正则表达式中没有读到那么远。 【参考方案1】:

首先,您需要在旧的正则表达式中插入和额外的反斜杠\ foreach 反斜杠,否则 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());

【讨论】:

这个正则表达式中的哪个子匹配组包含视频代码? 您的正则表达式中有一些多余的转义,这里删除了它们:https?://(?:[0-9A-Z-]+\\.)?(?:youtu \\.be/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]11)(?=[^\\w\ \-]|$)(?![?=&+%\\w]*(?:['\"][^]*>|))[?=&+%\\ w]* 它不适用于此 URL `youtube.com/embed/lwnIuosYGZo'【参考方案2】:

上面的 Marcus 有一个很好的正则表达式,但我发现它无法识别其中包含“www”但不包含“http(s)”的 youtube 链接 例如 www.youtube....

我有一个更新:

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

除了开头都一样

【讨论】:

以上是关于Youtube 完整的 Java 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

完整复习(包含语法)--MYSQL正则表达式

youtube URL 的正则表达式

Youtube视频网址正则表达式[重复]

YouTube 网址 - 正则表达式

YouTube ID 的正则表达式 [重复]

使用正则表达式的 jQuery Youtube URL 验证