使用或不使用RegEx提取YouTube ID

Pir*_*aba 5 java regex youtube

请告诉我如何在不使用正则表达式的情况下获取youtube ID?

使用以下URL方法,无法正常工作

http://www.youtube.com/e/dQw4w9WgXcQ

http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ

public static String extractYTId(String youtubeUrl) {
    String video_id = "";

    try {
        if(youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http")) {
            String expression = "^.*((youtu.be" + "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
            //String expression = "^.*(?:youtu.be\\/|v\\/|e\\/|u\\/\\w+\\/|embed\\/|v=)([^#\\&\\?]*).*";
            CharSequence input = youtubeUrl;
            Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(input);
            if(matcher.matches()) {
                String groupIndex1 = matcher.group(7);
                if(groupIndex1 != null && groupIndex1.length() == 11)
                    video_id = groupIndex1;
            }
        }
    } catch(Exception e) {
        Log.e("YoutubeActivity", "extractYTId " + e.getMessage());
    }

    return video_id;
}
Run Code Online (Sandbox Code Playgroud)

其他链接工作正常

http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0

http://www.youtube.com/embed/0zM3nApSvMg?rel=0

http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index

http://www.youtube.com/watch?v=0zM3nApSvMg

http://youtu.be/0zM3nApSvMg

http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s

http://youtu.be/dQw4w9WgXcQ

http://www.youtube.com/embed/dQw4w9WgXcQ

http://www.youtube.com/v/dQw4w9WgXcQ

http://www.youtube.com/watch?v=dQw4w9WgXcQ

http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0

Kir*_*kov 1

您的正则表达式是为 youtu.be 域设计的,当然它不适用于 youtube.com 域。

  1. 从 URL 字符串构造 java.net.URL ( https://docs.oracle.com/javase/7/docs/api/java/net/URL.html )
  2. 用于URL#getQuery()获取查询部分
  3. 检查将 URI 字符串解析为名称-值集合,了解将查询部分解码为名称-值映射并获取名称“v”的值的方法
  4. 如果没有“查询”部分(如 中http://www.youtube.com/e/dQw4w9WgXcQ),则使用 URL#getPath() (将为您提供/e/dQw4w9WgXcQ)并从中解析您的视频 ID,例如,通过跳过前 3 个符号: url.getPath().substring( 3)

更新。为什么不使用正则表达式?因为标准 JDK URL 解析器更加健壮。它正在由整个 Java 社区进行测试,而基于 RegExp 的重新发明的轮子仅由您自己的代码进行测试。