-3

我正在尝试编写一个简单的 java 正则表达式来从其 url 中提取给定 youtube 视频的视频 ID。例如:

http://www.youtube.com/watch?v=-mzvAAuCo1c

我想提取出来:-mzvAAuCo1c

这是我正在尝试的:

Pattern pattern = Pattern.compile("v=([^&]+)");
String url = "http://www.youtube.com/watch?v=-mzvAAuCo1c";
Matcher matcher = pattern.match(url);
System.out.println(matcher.getGroupCount() ); //outputs 1
System.out.println(matcher.matches() ); //returns false;
System.out.println( matcher.group(0) ); //throws exception, same for 1

我究竟做错了什么?

4

3 回答 3

2

调用find以匹配部分String. 不要在调用matches后调用find- 这将导致IllegalStateException. 您想要捕获组1而不是0后者返回完整的String

Pattern pattern = Pattern.compile("v=([^&]+)");
String url = "http://www.youtube.com/watch?v=-mzvAAuCo1c&foo=3";
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
    System.out.println(matcher.groupCount()); 
    System.out.println(matcher.group(1)); 
}
于 2013-10-06T23:24:59.410 回答
2
Matcher matcher = pattern.match(url);
System.out.println(matcher.getGroupCount() ); //outputs 1

首先,上面的两行甚至没有编译。将它们更改为:

Matcher matcher = pattern.matcher(url);
System.out.println(matcher.groupCount() ); //outputs 1

其次,你的正则表达式:

Pattern pattern = Pattern.compile("v=([^&]+)");

只匹配输入的一部分,这就是为什么

matcher.matches()

返回false。将正则表达式更改为:

Pattern pattern = Pattern.compile(".*v=([^&]+)");

最后,由于matcher.matches()不返回true,该语句

matcher.group(0)

会抛出异常。

固定代码:

        Pattern pattern = Pattern.compile(".*v=([^&]+)");
        String url = "http://www.youtube.com/watch?v=-mzvAAuCo1c";
        Matcher matcher = pattern.matcher(url);
        System.out.println(matcher.groupCount()); //outputs 1
        System.out.println(matcher.matches()); //returns true;
        System.out.println(matcher.group(1)); //returns -mzvAAuCo1c
于 2013-10-06T23:28:30.740 回答
0

尝试这个

(?<=videos\/|v=)([\w-]+)

正在使用

public static void main(String[] args) {

String link = "http://gdata.youtube.com/feeds/api/videos/xTmi7zzUa-M&whatever";
String pattern = "(?:videos\\/|v=)([\\w-]+)";

Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(link);

if(matcher.find()){
    System.out.println(matcher.group());
    }
}

在这里找到。

于 2013-10-06T23:19:22.913 回答