web-dev-qa-db-fra.com

Retourne la première correspondance de Ruby regex

Je cherche un moyen d'effectuer une correspondance regex sur une chaîne en Ruby et de la faire court-circuiter lors de la première correspondance.

La chaîne que je traite est longue et d'après ce à quoi elle ressemble, la méthode standard (méthode match) traiterait le tout, collecterait chaque correspondance et renverrait un objet MatchData contenant toutes les correspondances.

match = string.match(/regex/)[0].to_s
92
Daniel Beardsley

Tu pourrais essayer variableName[/regular expression/]. Voici un exemple de sortie d'irb:

irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders"
=> "erik kalle johan anders erik kalle johan anders"
irb(main):004:0> names[/kalle/]
=> "kalle"
128
Presidenten

Vous pouvez utiliser []: (qui est comme match)

"[email protected]"[/\+([^@]+)/, 1] # matches what is inside ()
# => "account2"
"[email protected]"[/\+([^@]+)/, 0] # matches whole regexp
# => "+account2"
52
Benjamin Crouzier

Si seule l'existence d'une correspondance est importante, vous pouvez choisir

/regexp/ =~ "string"

Dans tous les cas, match ne doit renvoyer que le premier hit, tandis que scan recherche dans toute la chaîne. Par conséquent, si

matchData = "string string".match(/string/)
matchData[0]    # => "string"
matchData[1]    # => nil - it's the first capture group not a second match
22
Slartibartfast

Je ne sais pas encore si cette fonctionnalité est géniale ou tout simplement folle, mais votre expression régulière peut définir des variables locales.

/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0
dollars #=> "3"

(Tiré de http://Ruby-doc.org/core-2.1.1/Regexp.html ).

4
Felix

Une expression régulière (regex) n'est rien d'autre qu'une machine à états finis (FSM).

Un FSM tente de répondre à la question "Cet état est-il possible ou non?"

Il continue d'essayer de faire correspondre un modèle jusqu'à ce qu'une correspondance soit trouvée (succès) ou jusqu'à ce que tous les chemins soient explorés et qu'aucune correspondance n'ait été trouvée (échec).

En cas de succès, la question "Cet état est-il possible ou non?" a été répondu par un "oui". Par conséquent, aucune autre correspondance n'est nécessaire et le regex revient.

Voir this et this pour en savoir plus.

Plus loin: voici un exemple intéressant pour montrer comment fonctionne l'expression régulière. Ici, une expression régulière est utilisée pour détecter si un nombre donné est premier. Cet exemple est en Perl, mais il peut également être écrit en Ruby.

1
Litmus