web-dev-qa-db-fra.com

Convertir une chaîne en expression régulière ruby

J'ai besoin de convertir une chaîne comme "/ [\ w\s] + /" en expression régulière.

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

J'ai essayé d'utiliser différentes méthodes Regexp comme:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, de même Regexp.compile et Regexp.escape. Mais aucun d'eux ne revient comme prévu.

De plus, j'ai essayé de supprimer les barres obliques inverses:

Regexp.new("[\w\s]+") => /[w ]+/ Mais pas de chance.

Ensuite, j'ai essayé de faire les choses simplement:

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

Ça s'échappe. Maintenant, comment la chaîne pourrait-elle rester en l'état et être convertie en un objet regexp?

110
cmthakur

Il semble que vous ayez besoin que la chaîne initiale soit entre guillemets simples (voir this page )

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

Pour être clair

  /#{Regexp.quote(your_string_variable)}/

travaille aussi

edit: a ajouté your_string_variable à Regexp.quote, pour la correction.

128
Sergey Gerasimov

Cette méthode échappera en toute sécurité à tous les caractères ayant une signification spéciale:

/#{Regexp.quote(your_string)}/

Par exemple, . sera échappé, car il est autrement interprété comme "n'importe quel caractère".

N'oubliez pas d'utiliser une chaîne entre guillemets, sauf si vous souhaitez une interpolation de chaîne régulière, où la barre oblique inverse a une signification particulière.

34
sandstrom

Utilisation de la notation%:

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

ou

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

De aide :

% r [] Expression rationnelle interpolée (des drapeaux peuvent apparaître après le délimiteur de fermeture)

7
BitOfUniverse

La gemme to_regexp peut faire le travail.

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

Vous pouvez également utiliser le modificateur:

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

Enfin, vous pouvez être plus paresseux en utilisant: 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/}
4
ryan