2012-05-10 6 views
6

Я хочу использовать grep со строкой как шаблон регулярного выражения. Как я могу это сделать?Ruby grep со строковым аргументом

Пример:

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

Но я хочу, чтобы подготовить свое выступление первого

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

Как я этого добиться? Мне нужна строка, подготовленная, потому что это идет в алгоритм поиска, и запрос будет изменяться при каждом запросе. Спасибо.

+0

Когда я сказал, что grep с аргументом строки терпит неудачу, он не дает ошибку, но ничего не возвращает ничего – gkaykck

+0

У меня есть запрос от пользователя, который является строкой – gkaykck

+0

Это непростой вопрос. Посмотрите на [этот вопрос] (http://stackoverflow.com/questions/6669425/convert-a-regular-expression-in-a-string-to-a-regexp-object-in-ruby) – Flexoid

ответ

9

Регулярные выражения поддержки интерполяции, так же, как строки:

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

Обратите внимание, что вы можете избежать значение перед его интерполяцией, особенно если оно предоставлено ненадежным пользователем: '/ # {Regexp.escape (user_provided_string)}/i' или' Regexp.new (Regexp.escape (user_provided_string), «i») '. Это, например, относится к "." как литерал ».«символ, а не как« любой символ ». Короткий, но загадочный способ как избежать строки * и * превратить ее в регулярное выражение, вы можете сделать' Regexp.union (user_provided_string) '. –

1

Попробуйте это:

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

Я не могу , у меня есть строка от пользователя, как я могу объединить эту строку с/asd/i? – gkaykck

4

Имея что-то в кавычках не то же самое, как и сама вещь. /a/i - Regexp, "https://stackoverflow.com/a/i" - строка. Для построения Regexp из строки сделать это:

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

Regexp.new ('/ asd/i') возвращает регулярное выражение, подобное (? -mix: \/asd \/i)? – gkaykck

+0

@gkaykck результат не то же самое на моей машине, все же я хотел бы подчеркнуть, что регулярное выражение не является строкой. Я просто показываю вам, как построить регулярное выражение из строки. В приведенном выше примере, если str = "/ u /", тогда r станет/\/u \ //, что не то, что вы хотите, я считаю, что вы можете понять, как сделать то, что вы хотите –

1

Edit:

Я нашел лучший способ

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)) 

Мой старый ответ:

Попробуйте сделать это случай или если заявление проходит, если они хотят нечувствительным поиск включить или выключить, и т.д.

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/я» является строкой. Почему бы не сделать Regrexp? Если вам необходимо перейти от строки к Regexp один из способов сделать это путем создания нового объекта РегВыр:

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

Так что, возможно,

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

является то, что вы ищете.

Но в целом я не думаю, что вы можете просто «использовать строку как шаблон регулярного выражения», хотя я новичок и, возможно, ошибаюсь.

Смежные вопросы