所以我有一个非常具体的网址,往往会遵循以下格式:
http://mtc.cdn.vine.co/r/videos/0DCB6FF2EF1179983941847883776_38a153447e7.1.5.3901866229871838946.mp4?versionId=.k9_w6W7t1Yr1KUCWRIm6AnYhSdOUz32
基本上我想从.
之后和?versionId
之前抓取所有内容,因为我认为这是文件扩展名的一致位置。
我目前有这样的地方\.\.{0}(.+)\?versionId
它匹配从第一个.
到versionId
的所有内容。
我想做的一个解决方案是使用.
作为分隔符。我从来没有试过限制一个角色,但基本上我希望它尝试匹配以.
开头的所有内容,拒绝任何.
前导?
的内容。
任何人都知道如何让它发挥作用?
答案 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((?<=...)
),正向前瞻((?=...)
)和否定的字符集([^...]
)。