web-dev-qa-db-fra.com

Interpolation d'une chaîne dans une expression régulière

Je dois remplacer la valeur d'une chaîne dans mon expression régulière en Ruby. Y a-t-il un moyen facile de faire ceci? Par exemple:

foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 
if goo =~ /value of foo here dynamically/
  puts "success!"
end
144
Chris Bunch

Identique à l'insertion de chaîne.

if goo =~ /#{Regexp.quote(foo)}/
#...
255
Jonathan Lonowski

Notez que le Regexp.quote dans la réponse de Jon L. est important!

if goo =~ /#{Regexp.quote(foo)}/

Si vous faites juste la version "évidente":

if goo =~ /#{foo}/

les périodes de votre texte de correspondance sont traitées comme des caractères génériques d'expression rationnelle et "0.0.0.0" correspondra à "0a0b0c0".

Notez également que si vous voulez vraiment vérifier une correspondance de sous-chaîne, vous pouvez simplement faire

if goo.include?(foo)

qui ne nécessite pas de devis supplémentaire ni de souci des caractères spéciaux.

110
glenn mcdonald

Regexp.escape(foo) serait probablement un point de départ, mais y a-t-il une bonne raison pour laquelle vous ne pouvez pas utiliser l'interpolation d'expression plus conventionnelle: "my stuff #{mysubstitutionvariable}"?

En outre, vous pouvez simplement utiliser !goo.match(foo).nil? avec une chaîne littérale.

6
JasonTrue
Regexp.compile(Regexp.escape(foo))
6
Markus Jarderot

Utilisez Regexp.new:

if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
3
Jeremy Ruten

Voici une autre réponse limitée mais utile:

J'ai découvert que je peux facilement insérer dans une expression régulière sans utiliser Regexp.quote ou Regexp.escape si je viens d'utiliser des guillemets simples sur ma chaîne d'entrée: (une correspondance d'adresse IP)

IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key 
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0") 
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"

les guillemets simples interprètent uniquement \\ et\'.

http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes

Cela m'a aidé lorsque j'ai dû utiliser plusieurs fois la même portion longue d'une expression régulière. Pas universel, mais correspond à l'exemple de la question, je crois.

2
Plasmarob