2012-05-10 36 views
6

Grep'i regex pattern olarak bir string ile kullanmak istiyorum. Bunu nasıl yapabilirim?String argümanı olan Ruby grep

Örnek:

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

Ama ilk ifademi hazırlamak istiyorum

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

Bu nasıl elde edebilirsiniz? Hazırlanmış bir dizeye ihtiyacım var çünkü bu bir arama algoritmasına gidiyor ve her istekte sorgu değişiyor. Teşekkürler.

+0

Dize argümanı ile grep başarısız olduğunu söylediğimde, bir hata vermez, ya da – gkaykck

+0

hiçbiri döndürmez. Kullanıcıdan bir sorgu var, bir dize olan – gkaykck

+0

Basit bir soru değil. [Bu soruya bakın] (http://stackoverflow.com/questions/6669425/convert-a-regular-expression-in-a-string-to-a-regexp-object-in-ruby) – Flexoid

cevap

9

Düzenli ifadeler sadece dizeleri gibi, interpolasyon desteklemektedir:

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

Kaçmak isteyebileceğinizi unutmayın. Özellikle güvenilmeyen bir kullanıcı tarafından sağlanırsa, enterpolasyondan önceki değer: '/ # {Regexp.escape (user_provided_string)}/i' veya' Regexp.new (Regexp.escape (user_provided_string), "i") '. Bu örneğin bir "." değişmez olarak "."karakter" ve "herhangi bir karakter" olarak değil. Hem bir dizeden kaçmak için kısa hem de şifreli bir yol olarak * ve * bir normal ifadeye çevirirseniz, "Regexp.union (user_provided_string)" işlevini kullanabilirsiniz. –

1

bu deneyin: tırnak içinde

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

, bir dizeden sahibim, bu dizeyi/asd/i ile nasıl birleştirebilirim? – gkaykck

4

Having şey şeyin kendisi ile aynı değildir. /a/i Regexp, "https://stackoverflow.com/a/i" dizesidir. dizesinden bir RegExp inşa etmek bunu:

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

Regexp.new ('/ asd/i'), (? -mix: \/asd \/i) gibi bir regex döndürüyor? – gkaykck

+0

@gkaykck sonucu makinemde aynı değil, yine de stresten vazgeçmek istediğim bir regexp dizgesi değil. Sadece bir dizeden bir regexp oluşturmayı gösteriyorum. Yukarıdaki örnekte str = "/ u /" olursa r//// \\ olacaksınız, ne istediğinizi değil, istediğinizi nasıl yapacağınızı anlayabileceğinizi düşünüyorum –

1

Düzenleme: Daha iyi bir yol buldum

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

Aşağıdaki eski Yanıtım:

onlar kapatmak duyarsız arama istemek veya eğer

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' String olduğu vb, bir vaka veya deyim geçen eğer yapmayı deneyin. Neden bir Regrexp yapmıyorsunuz? Eğer RegExp dizesi bunu bir şekilde gitmek gerekiyorsa yeni bir Normal ifade nesnesi oluşturarak geçerli:

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

Bu yüzden belki,

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

aradığınız budur.

Ama genel olarak bir "regexp modeli olarak bir dizgi kullanabileceğinizi" düşünmüyorum, ancak yeni başlayan biriyim ve bu konuda yanlış olabilirsiniz.