2014-06-17 4 views
1

J'ai la chaîne suivante:regex plusieurs correspondances avec ou regarder derrière

'/photos/full/1/454/6454.jpg?20140521103415','/photos/full/2/452/54_2.jpg?20140521104743','/photos/full/3/254/C2454_3.jpg?20140521104744'

Ce que je veux analyser est l'adresse de / au ? mais je ne peux pas sembler comprendre.

Jusqu'à présent, je /(?<=')[^?]*/ qui ont bien obtenir le premier lien, mais les deuxième et troisième lien commencera par ,'/photos/full/... < --notice qu'il commence par un ,'

Si j'essaie alors /(?<=',')[^?]*/ je reçois la deuxième et troisième lien mais manquez le premier lien.

Plutôt que de faire 2 regexes, est-ce que je peux les combiner pour faire 1? Je l'ai essayé d'utiliser `/ ((< = | [? ^])? (< = ',') */sans résultat

Mon code est de la forme matches = string.scan(regex) puis-je lancer un match.each. bloc ...

+0

Ancrage au début de la chaîne * ou * virgule: '/ (?:^|,) ...' Et capture '... \/([^ \ /?] +) \?' – DavidO

+0

FYI échantillon ajouté code et explication :) – zx81

Répondre

3

Dans Ruby 2, qui a \K, vous pouvez utiliser cette simple expression régulière (voir demo):

'\K/[^?]+ 

Pour voir tous les matches:

regex = /'\K\/[^?]+/ 
subject.scan(regex) {|result| 
# inspect result 
} 

Expliquer Regex

'      # '\'' 
\K      # 'Keep Out!' abandons what we have matched so far 
\/      # '/' 
[^?]+     # any character except: '?' (1 or more times 
         # (matching the most amount possible)) 
+0

merci, 1 chose bien que votre premier '' \ K/[^?] + 'Ait besoin d'échapper la barre oblique –

+0

@Chowza Merci, ça marche! En ce qui concerne le '/', il est déjà échappé dans l'exemple de code Ruby. Mais comme une regex pure, le '/' n'a pas besoin d'être échappé, et est généralement présenté de cette façon. (La raison pour laquelle nous échappons au '/' dans Ruby est qu'il est utilisé comme délimiteur.) – zx81

+0

Intéressant. Je ne savais pas à propos de '\ K'.+1 –

3

Vous pouvez utiliser ceci:.

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

(?<=,|^) vérifie que la citation est précédée par une virgule ou le début de la chaîne/ligne et où \K supprime tous les sur la gauche (virgule ici) à partir du résultat du match

ou plus simple:

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

tout ce qui est pas une citation ou un point d'interrogation suivie d'un point d'interrogation.

+0

Réponse presque simultanée et identique - il est juste de partager l'amour! ... +1 :) – zx81

+0

Intéressant. Je ne savais pas à propos de '\ K'. +1 –

0

On peut simplement utiliser un positif et opérateur préanalyse non gourmand, et cela bien sûr ne se limite pas à v2.0:

str.scan(/(?<=')\/.*?(?=\?)/) 
    #=> ["/photos/full/1/454/6454.jpg", 
    # "/photos/full/2/452/54_2.jpg", 
    # "/photos/full/3/254/C2454_3.jpg"] 

Edit: J'ai ajouté un positif lookbehined pour la seule citation. Voir les commentaires.

+0

Salut Cary, c'était un moyen simple ... Mais il semble qu'être précédé d'une citation était une partie importante de ses spécifications. :) – zx81

+0

Hmmm. Peut-être, @ zx81. J'ai édité. Merci. –

Questions connexes