2010-01-12 5 views
0

J'ai la ligne suivantecorrespondant à une chaîne en rubis avec regex

'passenger (2.2.5, 2.0.6)'.match(//)[0] 

qui ne correspond pas à l'évidence encore rien

Je veux revenir juste le contenu de (2.2.5, donc tout après les parenthèses ouvertes et avant la virgule.

Comment est-ce que je ferais ceci?

+1

La chose importante lors de la création de regex est de noter vos caractéristiques de liaison. Vous voulez identifier les caractères uniques ou les mots qui seront toujours juste avant ou après les éléments que vous souhaitez identifier. Dans ce cas, '(' sera toujours juste avant, et ',' sera toujours juste après, rendant l'expression régulière très simple (comme l'indique szeryf) .La seule complication est que '(' est un caractère spécial, vous obligeant à citez-le avec une barre oblique inverse –

Répondre

2

solution Beanish échoue sur plus de 2 numéros de version, vous devez utiliser quelque chose comme:

>> 'passenger (2.2.5, 2.0.6, 1.8.6)'.match(/\((.*?),/)[1] # => "2.2.5" 
+1

vous avez raison –

+1

si seulement. et 0-9 sont valides, vous pouvez même obtenir plus précis /\(([\.0-9]*),/ – Beanish

+0

szeryf, que regex a été brouillé dans le formatage, je pense.Il a des parenthèses incompatibles comme il apparaît dans mon navigateur: /((.*?),/ –

1
'passenger (2.2.5, 2.0.6)'.match(/\((.*),/)[1] 

si vous utilisez l'élément 1 $, il est le groupe qui se trouve dans le()

+0

Je pense que vous avez oublié un passager '/ \' '(2.2.5, 2.0.6)'. match (/ \ ((. *), /) [0] –

+0

merci! Je suppose était un peu plus facile que je pensais! –

+2

utiliser un outil comme http://rubular.com/ ou http://www.gskinner.com/RegExr/ pour tester votre regex en ligne – Beanish

1
#!/usr/bin/env ruby 

s = 'passenger (2.2.5, 2.0.6)' 
p s.scan(/(?:\(|, *)([^,)]*)/).flatten # => ["2.2.5", "2.0.6"] 
+0

ooh c'est sympa. –