2014-06-17 55 views
1

我有以下字符串:使用OR正則表達式的多個匹配向後看

'/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/... < --notice開始如果我再嘗試/(?<=',')[^?]*/我得到第二和第三個鏈接,但錯過了第一個鏈接。

而不是做2個正則表達式,有沒有一種方法可以將它們結合起來做1?我已經嘗試使用`/((< =?| [^?] ')?(< ='')* /無濟於事

我的代碼的形式matches = string.scan(regex),然後我跑match.each。塊...

+0

錨定到字符串*或*逗號開頭:'/(?:^ |,)...'並捕獲'... \ /([^ \ /?] +)'? – DavidO

+0

附加樣本代碼和解釋:) – zx81

回答

3

在Ruby中2,其中有\K,你可以使用這個簡單的正則表達式(見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)) 
+0

謝謝,雖然你的第一個''\ K/[^?] +'需要逃避正斜槓1件事 –

+0

@Chowza謝謝,很高興它的工作!關於'/',它已經在Ruby代碼示例中轉義了。但作爲一個純正則表達式,'/'不需要轉義,並且通常以這種方式呈現。 (我們在Ruby中轉義'/'的原因是它被用作分隔符。) – zx81

+0

有趣的。我不知道'\ K'。+1 –

3

您可以使用此:

(?<=,|^)'\K[^?]+ 

(?<=,|^)檢查所引述的前面有一個逗號或串/線的起點在哪裏\K刪除所有的左側(逗號在這裏)

或更爲簡單:

[^?']+(?=\?) 

所有不報價或問號後跟一個問號。

+0

幾乎同時和相同的答案 - 這是唯一公平的分享愛情... ... +1 :) – zx81

+0

有趣的。我不知道'\ K'。 +1 –

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

編輯:我添加了一個積極的lookbehined爲單引號。看評論。

+0

嘿卡里,這是一個很好的簡單的方法......但似乎在引語之前是他規範的重要組成部分。 :) – zx81

+0

嗯。也許吧,@ zx81。我編輯過。謝謝。 –