正则表达式 - 匹配URL中的文件扩展名

时间:2015-02-19 00:40:22

标签: ruby regex

所以我有一个非常具体的网址,往往会遵循以下格式:

http://mtc.cdn.vine.co/r/videos/0DCB6FF2EF1179983941847883776_38a153447e7.1.5.3901866229871838946.mp4?versionId=.k9_w6W7t1Yr1KUCWRIm6AnYhSdOUz32

基本上我想从.之后和?versionId之前抓取所有内容,因为我认为这是文件扩展名的一致位置。

我目前有这样的地方\.\.{0}(.+)\?versionId它匹配从第一个.versionId的所有内容。

我想做的一个解决方案是使用.作为分隔符。我从来没有试过限制一个角色,但基本上我希望它尝试匹配以.开头的所有内容,拒绝任何.前导?的内容。

任何人都知道如何让它发挥作用?

2 个答案:

答案 0 :(得分:3)

你的目标是获得' mp4'?可能考虑根本不使用正则表达式...

> require 'uri'
> uri = URI.parse('http://mtc.cdn.vine.co/r/videos/0DCB6FF2EF1179983941847883776_38a153447e7.1.5.3901866229871838946.mp4?versionId=.k9_w6W7t1Yr1KUCWRIm6AnYhSdOUz32')
=> #<URI::HTTP http://mtc.cdn.vine.co/r/videos/0DCB6FF2EF1179983941847883776_38a153447e7.1.5.3901866229871838946.mp4?versionId=.k9_w6W7t1Yr1KUCWRIm6AnYhSdOUz32>
> uri.path
=> "/r/videos/0DCB6FF2EF1179983941847883776_38a153447e7.1.5.3901866229871838946.mp4"
> File.extname(uri.path)
=> ".mp4"

答案 1 :(得分:0)

完全与Philip Hallstrom达成协议,这是一个典型的XY问题。但是,如果您真的希望磨练您的Regexp技能,那么您的问题的字面解决方案是(Rubular):

(?<=\.)[^.]+(?=\?)

“从之前的某个时段开始,匹配任意数量的非期间,匹配问号所在的位置。”

要理解这一点,请阅读正面的lookbehind((?<=...)),正向前瞻((?=...))和否定的字符集([^...])。