2012-05-10 16 views
6

Quiero usar grep con una cadena como patrón de expresión regular. ¿Cómo puedo hacer eso?Ruby grep con argumento de cadena

Ejemplo:

myArray.grep(/asd/i) #Works perfectly. 

pero quiero preparar en primer lugar mi declaración

searchString = '/asd/i' 
myArray.grep(searchString) # Fails 

¿Cómo puedo lograr esto? Necesito una cadena preparada porque esto entra en un algoritmo de búsqueda y la consulta va a cambiar en cada solicitud. Gracias.

+0

Cuando dije grep con argumento de cadena falla, no da un error, pero tampoco devuelve nada – gkaykck

+0

tengo una consulta del usuario, que es una cadena – gkaykck

+0

No es una pregunta simple. Mire [esta pregunta] (http://stackoverflow.com/questions/6669425/convert-a-regular-expression-in-a-string-to-a-regexp-object-in-ruby) – Flexoid

Respuesta

9

Las expresiones regulares compatibles con la interpolación, al igual que las cuerdas:

var = "hello" 
re = /#{var}/i 
p re #=> /hello/i 
+0

Ten en cuenta que es posible que desees escapar el valor antes de interpolarlo, especialmente si es proporcionado por un usuario que no es de confianza: '/ # {Regexp.escape (user_provided_string)}/i' o' Regexp.new (Regexp.escape (user_provided_string), "i") '. Esto trataría, por ejemplo, un "." como un literal "."personaje y no como" cualquier personaje ". Como forma corta pero críptica de escapar de una cadena * y * convertirla en una expresión regular, puedes hacer' Regexp.union (user_provided_string) '. –

1

Prueba esto:

searchString = /asd/i 
myArray.grep(searchString) 
+0

no puedo , tengo una cadena de un usuario, ¿cómo puedo fusionar esa cadena con/asd/i? – gkaykck

4

Tener algo entre comillas no es la misma que la cosa misma. /a/i es Regexp, "https://stackoverflow.com/a/i" es una cadena. Para construir una expresión regular de la cadena de hacer esto:

r = Regexp.new str 
myArray.grep(r) 
+0

Regexp.new ('/ asd/i') devuelve una expresión regular como (? -mix: \/asd \/i)? – gkaykck

+0

@gkaykck el resultado no es el mismo en mi máquina, aún así, lo que quería destacar es que una expresión regular no es una cadena. Simplemente te estoy mostrando cómo construir una expresión regular a partir de una cadena. En el ejemplo anterior si str = "/ u /" entonces r se convertirá en/\/u \ // que no es lo que quieres, creo que puedes averiguar cómo hacer lo que quieras –

1

Editar:

he encontrado una mejor manera

myString = "Hello World!" 
puts "Hello World!" 
puts "Enter word to search" 
input_search = gets.chomp 
puts "Search insensitive? y/n" 

answer = gets.chomp 

if answer == "y" 
    ignore = "Regexp::IGNORECASE" 
else 
    ignore = false 
end 

puts myString.lines.grep(Regexp.new(input_search, ignore)) 

Mi respuesta anterior a continuación:

intentar hacer que un caso o si la declaración que pasa si quieren búsqueda insensible encendido o apagado, etc

myString = "Hello World!" 
puts "Enter word to search" 
input_search = gets.chomp 
puts "Search insensitive? y/n" 
case gets.chomp 
    when "y" 
    puts myString.lines.grep(Regexp.new(/#{input_search}/i)) 
    when "n" 
    puts myString.lines.grep(Regexp.new(/#{input_search}/)) 
end 
0

'/ asd/i' es una cadena. ¿Por qué no hacerlo un Regrexp? Si tiene que ir de String a Regexp una manera de hacerlo es mediante la creación de un nuevo objeto Regexp:

>> re = Regexp.new('/asd/i') 
=> /\/asd\/i/ 
>> re = Regexp.new("asd", "i") 
=> /asd/i 

Así que tal vez,

>> str = gets.chomp #user inputs 
=> "Hello World" 
re = Regexp.new(str, "i") 
=> /Hello World/i 

es lo que estás buscando.

Pero, en general, no creo que pueda simplemente "usar una cadena como patrón de expresión regular", aunque soy un principiante y podría estar equivocado al respecto.

Cuestiones relacionadas