Devo sostituire il valore di una stringa nella mia espressione regolare in Ruby. C'è un modo semplice per farlo? Per esempio:
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
Devo sostituire il valore di una stringa nella mia espressione regolare in Ruby. C'è un modo semplice per farlo? Per esempio:
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
Risposte:
Come per l'inserimento di stringhe.
if goo =~ /#{Regexp.quote(foo)}/
#...
Si noti che la Regexp.quote
in risposta di Jon L. è importante!
if goo =~ /#{Regexp.quote(foo)}/
Se fai solo la versione "ovvia":
if goo =~ /#{foo}/
quindi i punti nel testo della partita vengono trattati come caratteri jolly regexp e "0.0.0.0"
corrisponderanno "0a0b0c0"
.
Nota anche che se vuoi davvero controllare la corrispondenza di una sottostringa, puoi semplicemente farlo
if goo.include?(foo)
che non richiede un preventivo aggiuntivo o preoccuparsi di caratteri speciali.
.quote()
) può essere utile anche se stai cercando di costruire un regex usando una stringa.
if goo.include?(foo)
" => True quando sei interessato a verificare l'esistenza. Se sei interessato a sostituire e utilizzare già String.gsub, allora Regexp.quote potrebbe essere la tua unica opzione.
Regexp.new
o Regexp.compile
.
Regexp.compile(Regexp.escape(foo))
Usa Regexp.new:
if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
Ecco un'altra risposta limitata ma utile:
Ho scoperto che posso inserire facilmente in un regex senza usare Regexp.quote o Regexp.escape se ho appena usato virgolette singole sulla mia stringa di input: (una corrispondenza dell'indirizzo 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"
le virgolette singole interpretano solo \\ e \ '.
http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes
Questo mi ha aiutato quando ho dovuto usare più volte la stessa lunga porzione di regex. Non universale, ma si adatta all'esempio della domanda, credo.
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
puts "success!" if goo =~ /#{foo}/