Interpolare una stringa in una regex


160

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

Stai cercando di vedere se foo è una sottostringa di goo? Non credo sia chiaro cosa stai chiedendo.
Neall,

Se è così, goo.include? (Pippo) è abbastanza!
Glenn McDonald,

1
No, non stavo cercando di vedere se foo è una sottostringa di goo; Avevo anche bisogno di fare qualche cattura, quindi includere non funzionava.
Chris Bunch,

Risposte:



125

Si noti che la Regexp.quotein 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.


3
Nota che il contrario (non usando .quote()) può essere utile anche se stai cercando di costruire un regex usando una stringa.
Jesse,

"se vuoi davvero solo verificare la corrispondenza di una sottostringa, puoi semplicemente fare 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.
Isaac Betesh,

Solo per aggiungere a Jesse nel caso in cui non sia ovvio, questo significa semplicemente passare la serie di caratteri che non è necessario sfuggire Regexp.newo Regexp.compile.
dylankb,

Grazie per l'utile spiegazione del motivo per cui potremmo voler usare Regexp.quote
Wylliam Judd,

7

Probabilmente Regexp.escape(foo)sarebbe un punto di partenza, ma c'è una buona ragione per cui non puoi usare l'interpolazione di espressioni più convenzionale:"my stuff #{mysubstitutionvariable}" ?

Inoltre, puoi semplicemente usare !goo.match(foo).nil?con una stringa letterale.




3

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.


sono curioso di sapere cosa verrà pensato al mio post qui, ma dubito che sarà visto così in basso qui ora.
Plasmarob,

-2
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/

2
No, questo darà un "vero" errato per "ecco alcune altre cose 070x0! 0", perché i punti sono jolly regexp.
Glenn McDonald,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.