Converte una stringa in un'espressione regolare ruby


118

Devo convertire stringhe come "/ [\ w \ s] + /" in un'espressione regolare.

"/[\w\s]+/" => /[\w\s]+/

Ho provato a utilizzare diversi Regexpmetodi come:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, allo stesso modo Regexp.compilee Regexp.escape. Ma nessuno di loro torna come mi aspettavo.

Inoltre ho provato a rimuovere i backslash:

Regexp.new("[\w\s]+") => /[w ]+/ Ma non avere fortuna.

Quindi ho provato a farlo in modo semplice:

str = "[\w\s]+"
=> "[w ]+"

Scappa. Ora come potrebbe la stringa rimanere così com'è e convertirsi in un oggetto regexp?

Risposte:


149

Sembra che qui sia necessario che la stringa iniziale sia racchiusa tra virgolette singole (fare riferimento a questa pagina )

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 

137

Per essere chiari

  /#{Regexp.quote(your_string_variable)}/

funziona anche

edit: racchiude la tua_string_variable in Regexp.quote, per correttezza.


3
Ho appena scoperto che non puoi aggiungere opzioni in questo modo, tipo /#{your_regex}/#{options}.
pduersteler

Suppongo che tu stia parlando di Rails? optionsè un hash e Ruby non è così dinamico =)
Sergey Gerasimov

2
Questo non fa quello che chiede OP su Ruby 2.1, converte "[\ w \ s] +" => / [w] + /
Luca Spiller

1
Si prega di notare che la risposta è stata data nell'anno 2012 :) A quel tempo tutto era perfetto
Sergey Gerasimov

4
È stato un anno perfetto.
Naftuli Kay

35

Questo metodo sfuggirà in modo sicuro a tutti i caratteri con un significato speciale:

/#{Regexp.quote(your_string)}/

Ad esempio, .verrà eseguito l'escape, poiché altrimenti viene interpretato come "qualsiasi carattere".

Ricordarsi di utilizzare una stringa con virgolette singole a meno che non si desideri che venga avviata l'interpolazione di stringhe regolare, dove la barra rovesciata ha un significato speciale.


2
Bello perché spiega come possiamo proteggere la variabile stringa che può contenere segni (come +.) che verrebbero interpretati nel Regexp.
rchampourlier

1
Questo non fa quello che chiede OP su Ruby 2.1, converte "[\ w \ s] +" => / [w \] \ + /
Luca Spiller

@LucaSpiller devi usare una stringa con virgolette singole, il backslash viene trattato come un carattere speciale nelle stringhe con virgolette doppie, motivo per cui ad esempio "\n"è una nuova riga ma '\n'non lo è.
sandstrom

8

Utilizzando la notazione%:

%r{\w+}m => /\w+/m

o

regex_string = '\W+'
%r[#{regex_string}]

Da aiuto :

% r [] espressione regolare interpolata (i flag possono apparire dopo il delimitatore di chiusura)


Questo non fa quello che chiede OP su Ruby 2.1, converte "[\ w \ s] +" => / [ws] + /
Luca Spiller

1
@Luca Spiller, grazie, le virgolette singole dovrebbero essere usate lì, aggiornerò la risposta.
BitOfUniverse

5

La gemma to_regexp può fare il lavoro.

"/[\w\s]+/".to_regexp => /[\w\s]+/

Puoi anche usare il modificatore:

'/foo/i'.to_regexp => /foo/i

Infine, puoi essere più pigro usando: detect

'foo'.to_regexp(detect: true)     #=> /foo/
'foo\b'.to_regexp(detect: true)   #=> %r{foo\\b}
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b}
'foo\b/'.to_regexp(detect: true)  #=> %r{foo\\b/}
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.