Youtube завершает Java Regex

Мне нужно разобрать несколько страниц, чтобы получить все их идентификаторы Youtube.

Я нашел много регулярных выражений в Интернете, но: Java не являются полными (они либо дают мне мусор в дополнение к идентификаторам, либо пропускают некоторые идентификаторы).

Тот, который я нашел, который кажется полным, размещен здесь. Но он написан на 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;

Ответ 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());
}

Ответ 2

У Marcus выше есть хорошее регулярное выражение, но я обнаружил, что он не распознает ссылки на YouTube, у которых есть "www", но не "http (s)" в них например, www.youtube....

У меня есть обновление:

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

это то же самое, за исключением начала