使用している正規表現は、Javaスタイルではなく、phpスタイルの正規表現です。たとえば、/ig;
最後にフラグを付けてください。
したがって、少し編集する必要があります。
val youtubeRgx = """https?://(?:[0-9a-zA-Z-]+\.)?(?:youtu\.be/|youtube\.com\S*[^\w\-\s])([\w \-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:[\'"][^<>]*>|</a>))[?=&+%\w-]*""".r
考えられるすべてのYouTubeURLでテストしましたが、機能します。例:
scala> youtubeRgx.pattern.matcher("http://www.youtube.com/watch?v=XrivBjlv6Mw").matches
res23: Boolean = true
そして値を抽出します:
"http://www.youtube.com/watch?v=XrivBjlv6Mw" match {
case youtubeRgx(a) => Some(a)
case _ => None
}
res33: Option[String] = Some(XrivBjlv6Mw)
Javaが正規表現で適切なコメントを許可しないのは残念なので、私はできることをしました:
val youtubeRgx = """https?:// # Required scheme. Either http or https.
|(?:[0-9a-zA-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.
|""".stripMargin.replaceAll("\\s*#.*\n", "").replace(" ","").r
(@ridgerunnerの回答から引用:文字列内のすべてのYouTubeビデオIDを検索)