116 votes

Ruby expression régulière à l'aide de la variable nom de

Il est possible de créer/utiliser un modèle d'expression régulière en ruby qui est basée sur la valeur d'un nom de variable?

Par exemple, nous savons tous que nous pouvons faire ce qui suit avec Ruby chaînes:

str = "my string"
str2 = "This is #{str}" # => "This is my string"

J'aimerais faire la même chose avec des expressions régulières:

var = "Value"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "a test foo"

Évidemment, cela ne fonctionne pas selon la liste, j'ai seulement mis là comme un exemple pour montrer ce que j'aimerais faire. J'ai besoin de regexp correspondance basée sur la valeur d'une variable du contenu.

207voto

Wayne Conrad Points 31052

Le code que vous pensez ne fonctionne pas, n':

var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' )   # => "a test foo"

Les choses sont encore plus intéressantes si var peut contenir expression régulière méta-caractères. Si elle le fait, et vous voulez que ces matacharacters à ce qu'ils font habituellement dans une expression régulière, la même gsub:

var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"

Toutefois, si votre chaîne de recherche contient des caractères de remplacement et vous ne pas voulez interprétés comme des caractères de remplacement, puis utiliser les Regexp.fuir comme ceci:

var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"

Ou tout simplement donner gsub une chaîne au lieu d'une expression régulière. En IRM >= 1.8.7, gsub permettra de traiter une chaîne de caractères de remplacement en argument une chaîne simple, pas une expression régulière:

var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"

(Il l'habitude d'être qu'une chaîne de caractères de remplacement argument gsub a été automatiquement converti en une expression régulière. Je sais que c'était de cette façon en 1.6. Je ne me souviens pas de la version introduit le changement).

Comme indiqué dans d'autres réponses, vous pouvez utiliser les Regexp.nouveau comme une alternative à l'interpolation:

var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"

13voto

FMc Points 22663

Il fonctionne, mais vous devez utiliser gsub! ou de céder le retour à une autre variable

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str

11voto

DigitalRoss Points 80400

Oui

str.gsub Regexp.new(var), 'foo'

7voto

GeekTantra Points 2606

Vous pouvez utiliser des expressions régulières par le biais de la variable péché ruby comme ceci:

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )

Consulter ce lien pour plus d'info:

http://codelikezell.com/how-to-use-ruby-variables-in-regular-expressions/

3voto

DNNX Points 3743
str.gsub( Regex.new("#{var}"), 'foo' )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X