斯卡拉 - 从URL
YouTube视频ID我从这里以下的正则表达式:https://stackoverflow.com/a/10405818/924999斯卡拉 - 从URL
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视频网址与视频ID:
val url = "http://www.youtube.com/watch?v=XrivBjlv6Mw"
url match {
case regex(result) => result
case _ => null
}
然而,似乎总是返回null,有什么我失踪或需要做不同?提前任何帮助
谢谢,非常感谢:)
,你必须是php风格的正则表达式,而不是Java风格的正则表达式 - 例如,请注意0标志在结尾处。
所以你只需要编辑了一下:
val youtubeRgx = """https?://(?:[0-9a-zA-Z-]+\.)?(?:youtu\.be/|youtube\.com\S*[^\w\-\s])([\w \-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:[\'"][^<>]*>|</a>))[?=&+%\w-]*""".r
我测试了所有可能的YouTube网址,和它的作品。例如:
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
(改编from @ ridgerunner的答案在这里:find all youtube video ids in string)
哇,非常感谢你的出色帮助:)我在这里收到很长时间的最好的答案之一:) – jhdevuk 2012-07-11 13:30:23
@sirjamm - 不客气:) – Rogach 2012-07-11 14:34:07
@Rogach - 您可以添加评论在如果以(?x)开头,则为正则表达式。 – sellmerfud 2012-07-11 21:53:50
一个更简单的方法:
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)
按照http://stackoverflow.com/questions/5830387/php-regex-find-all-youtube-video-ids-in-string/10405818#10405818,这不会赶上大多数IDS。 – Rogach 2012-07-11 12:00:03
First Scala接受Java风格的正则表达式。如果你提供斜杠,那么它们是模式的一部分,而不是分隔符。此外,标志必须为每个组指定,而不是在正则表达式之后。
第二,要匹配case regex(result)
,您必须在您的模式中定义匹配组。你必须将视频ID分组为匹配模式 - 我只是不知道这是否是过度复杂的模式。
请不要在Scala中使用'null'。如果视频ID合法可以或不可以存在,那么它应该是一个'Option [String]',返回'Some(result)'和'None'。如果正则表达式失败总是一个硬错误,那么在默认情况下抛出一个异常(或者如果你想对它有很强的功能,可以使用'Either')。 – 2012-07-11 10:55:40
感谢您的提示,你有任何想法,为什么正则表达式匹配不会返回结果? – jhdevuk 2012-07-11 11:14:00
不怕;调试既没有评论也没有解释性分解的192字符正则表达式不是我的一杯茶。由于输出只是一个布尔值(即“不匹配”),解决这个问题的唯一方法是将正则表达式分解成更小的部分,直到找到它失败的原因为止 - 这主要是* work *,并且不需要很多知识/见解等等。所以不用谢谢。 – 2012-07-11 12:04:02