2011-10-25 24 views
11

我需要解析几个页面才能获取所有的Youtube ID。Youtube完成Java Regex

我在网上发现了很多正则表达式,但是:Java的不完整(它们要么给我ID以外的垃圾,要么丢失一些ID)。

我发现那个似乎是完整的是托管here。但它是用JavaScript和PHP编写的。不幸的是我无法将它们翻译成JAVA。

有人可以帮我重写这个PHP正则表达式或Java中的下列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

为什么可选的子域不允许小写字母一样吗?您可能需要将该部分更改为'... [0-9A-Za-z - ] ...' – eykanal

+0

@eykanal它使用'i'标志。 – Marcus

+1

@马库斯 - 啊,很好,在正则表达式中没有读到那么远。 – eykanal

回答

20

所有你需要插入和老正则表达式额外的反斜杠\的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()); 
} 
+0

谢谢@马库斯! – mossaab

+0

此正则表达式中的子匹配组包含视频代码? – SeanPONeil

+0

看起来像$ 1,如PHP代码中的注释所示。 – SeanPONeil

3

马库斯具有良好的正则表达式,但我发现它不承认有“WWW”的YouTube链接,而不是“HTTP(S)”,在他们 例如www.youtube ....

我有一个更新:

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

它除了开始