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?
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]+/
Pour être clair
/#{Regexp.quote(your_string_variable)}/
travaille aussi
edit: a ajouté your_string_variable à Regexp.quote, pour la correction.
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.
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)
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/}