我有以下字符串:
'/photos/full/1/454/6454.jpg?20140521103415','/photos/full/2/452/54_2.jpg?20140521104743','/photos/full/3/254/C2454_3.jpg?20140521104744'
我要解析的是从/
到?
的地址,但我似乎无法弄明白。
到目前为止,我/(?<=')[^?]*/
会正确获取第一个链接,但第二个和第三个链接将以,'/photos/full/...
&lt;开头 - 请注意它以,'
<开头/ p>
如果我然后尝试/(?<=',')[^?]*/
我会收到第二个和第三个链接,但会错过第一个链接。
有没有一种方法可以将它们组合起来做1个而不是2个正则表达式?我尝试使用`/((?&lt; =&#39;)|(?&lt; =&#39;,&#39;)[^?] * /无效。
我的代码格式为matches = string.scan(regex)
,然后我运行match.each
块...
答案 0 :(得分:3)
您可以使用:
(?<=,|^)'\K[^?]+
其中(?<=,|^)
检查引号前面是逗号或字符串/行的开头。并且\K
从匹配结果中删除左侧的所有内容(此处为逗号)。
或更简单:
[^?']+(?=\?)
所有不是引号或问号后跟问号。
答案 1 :(得分:3)
在拥有\K
的Ruby 2中,您可以使用这个简单的正则表达式(参见demo):
'\K/[^?]+
查看所有比赛:
regex = /'\K\/[^?]+/
subject.scan(regex) {|result|
# inspect result
}
解释正则表达式
' # '\''
\K # 'Keep Out!' abandons what we have matched so far
\/ # '/'
[^?]+ # any character except: '?' (1 or more times
# (matching the most amount possible))
答案 2 :(得分:0)
可以简单地使用积极的前瞻和非贪婪的操作符,这当然不仅限于v2.0:
str.scan(/(?<=')\/.*?(?=\?)/)
#=> ["/photos/full/1/454/6454.jpg",
# "/photos/full/2/452/54_2.jpg",
# "/photos/full/3/254/C2454_3.jpg"]
编辑:我为单引号添加了一个积极的看法。看评论。