Convertir una cadena en ruby ​​de expresión regular


118

Necesito convertir cadenas como "/ [\ w \ s] + /" a una expresión regular.

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

Intenté usar diferentes Regexpmétodos como:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, de manera similar Regexp.compiley Regexp.escape. Pero ninguno de ellos regresa como esperaba.

Además, intenté eliminar las barras invertidas:

Regexp.new("[\w\s]+") => /[w ]+/ Pero no tengas suerte.

Luego intenté hacerlo simple:

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

Se escapa. Ahora, ¿cómo podría la cadena permanecer como está y convertirse en un objeto regexp?

Respuestas:


149

Parece que aquí necesita que la cadena inicial esté entre comillas simples (consulte esta página )

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

137

Para ser claro

  /#{Regexp.quote(your_string_variable)}/

también está funcionando

editar: envuelto your_string_variable en Regexp.quote, para mayor corrección.


3
Acabo de descubrir que no puede agregar opciones de esa manera, como /#{your_regex}/#{options}.
pduersteler

¿Supongo que estás hablando de Rails? optionses un hash, y Ruby no es tan dinámico =)
Sergey Gerasimov

2
Esto no hace lo que OP pide en Ruby 2.1, convierte "[\ w \ s] +" => / [w] + /
Luca Spiller

1
Tenga en cuenta que la respuesta se dio en el año 2012 :) En ese momento todo era perfecto
Sergey Gerasimov

4
Fue un año perfecto.
Naftuli Kay

35

Este método escapará de forma segura todos los caracteres con un significado especial:

/#{Regexp.quote(your_string)}/

Por ejemplo, .se escapará, ya que de lo contrario se interpretará como 'cualquier carácter'.

Recuerde usar una cadena entre comillas simples a menos que desee que se active la interpolación de cadena regular, donde la barra invertida tiene un significado especial.


2
Agradable porque explica cómo podemos proteger la variable de cadena que puede contener signos (como +.) que se interpretarían en Regexp.
rchampourlier

1
Esto no hace lo que pide OP en Ruby 2.1, convierte "[\ w \ s] +" => / [w \] \ + /
Luca Spiller

@LucaSpiller necesita usar una cadena entre comillas simples, la barra invertida se trata como un carácter especial en cadenas entre comillas dobles, por lo que, por ejemplo, "\n"es una nueva línea pero '\n'no lo es.
sandstrom

8

Usando la notación%:

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

o

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

De ayuda :

% r [] Regexp interpolado (las banderas pueden aparecer después del delimitador de cierre)


Esto no hace lo que pide OP en Ruby 2.1, convierte "[\ w \ s] +" => / [ws] + /
Luca Spiller

1
@Luca Spiller, gracias, las comillas simples deberían usarse allí, actualizaré la respuesta.
BitOfUniverse

5

La gema to_regexp puede hacer el trabajo.

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

También puedes usar el modificador:

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

Finalmente, puedes ser más vago 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/}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.