2

私はここから次の正規表現を持っています:https ://stackoverflow.com/a/10405818/924999

val regex = """/https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=&+%\w-]*/ig;""".r

私はYouTubeのビデオURLからビデオIDを抽出しようとしています:

val url = "http://www.youtube.com/watch?v=XrivBjlv6Mw"

url match {

    case regex(result) => result

    case _ => null

}

ただし、常にnullを返すようですが、何か足りないものや、別の方法で行う必要があるものはありますか?

助けてくれてありがとう、大いに感謝します:)

4

3 に答える 3

4

使用している正規表現は、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を検索

于 2012-07-11T12:09:32.883 に答える
0

はるかに単純なアプローチ:

scala> val url = "http://www.youtube.com/watch?v=XrivBjlv6Mw"
url: java.lang.String = http://www.youtube.com/watch?v=XrivBjlv6Mw

scala> val regex = "v=[\\w]*"r
regex: scala.util.matching.Regex = v=[\w]*

scala> for (x <-  regex findFirstIn url) yield x.replace("v=","")
res3: Option[java.lang.String] = Some(XrivBjlv6Mw)
于 2012-07-11T11:58:28.137 に答える
0

最初のScalaはJavaスタイルの正規表現を受け入れます。スラッシュを指定すると、それらはパターンの一部であり、区切り文字ではありません。また、フラグは正規表現の後ではなく、グループごとに指定する必要があります。

次に、case regex(result)一致させるには、パターンに一致するグループを定義する必要があります。ビデオIDを一致するパターンとしてグループ化する必要があります-それが過度に複雑なパターンの場合であるかどうかはわかりません。

于 2012-07-11T12:28:58.887 に答える