正则表达式与OR的多个匹配看后面

时间:2014-06-17 02:55:26

标签: ruby regex

我有以下字符串:

'/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块...

3 个答案:

答案 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"]

编辑:我为单引号添加了一个积极的看法。看评论。