2012-05-10 23 views
6

Tôi muốn sử dụng grep với chuỗi là mẫu regex. Làm thế nào tôi có thể làm điều đó?Ruby grep với đối số chuỗi

Ví dụ:

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

Nhưng tôi muốn chuẩn bị tuyên bố đầu tiên của tôi

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

Làm thế nào tôi có thể đạt được điều này? Tôi cần một chuỗi chuẩn bị bởi vì điều này là đi vào một thuật toán tìm kiếm và truy vấn sẽ thay đổi trên mọi yêu cầu. Cảm ơn.

+0

Khi tôi nói grep với đối số chuỗi không thành công, nó không đưa ra lỗi, nhưng nó không trả lại bất cứ điều gì hoặc là – gkaykck

+0

tôi có một truy vấn từ người dùng, đó là một chuỗi – gkaykck

+0

Đó không phải là câu hỏi đơn giản. Xem [câu hỏi này] (http://stackoverflow.com/questions/6669425/convert-a-regular-expression-in-a-string-to-a-regexp-object-in-ruby) – Flexoid

Trả lời

9

Regular expressions hỗ trợ nội suy, giống như chuỗi:

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

Lưu ý rằng bạn có thể muốn thoát giá trị trước khi bạn nội suy nó, đặc biệt nếu nó được cung cấp bởi một người dùng không tin cậy: '/ # {Regexp.escape (user_provided_string)}/i' hoặc' Regexp.new (Regexp.escape (user_provided_string), "i") '. Ví dụ này sẽ xử lý "." như một chữ "."nhân vật và không phải là" bất kỳ nhân vật ". Là một cách ngắn gọn nhưng khó hiểu để cả hai thoát khỏi một chuỗi * và * biến nó thành một regex, bạn có thể làm' Regexp.union (user_provided_string) '. –

1

Hãy thử điều này:

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

tôi không thể , tôi có một chuỗi đến từ một người sử dụng, làm thế nào tôi có thể hợp nhất chuỗi đó với/asd/i? – gkaykck

4

Có một cái gì đó trong dấu ngoặc kép là không giống như điều chính nó. /a/i là Regexp, "https://stackoverflow.com/a/i" là chuỗi. Để xây dựng một biểu thức chính quy từ chuỗi làm điều này:

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

Regexp.new ('/ asd/i') trả về một regex như (? -mix: \/asd \/i)? – gkaykck

+0

@gkaykck kết quả là không giống nhau trên máy tính của tôi, vẫn còn những gì tôi muốn nhấn mạnh là regexp không phải là một chuỗi. Tôi chỉ đơn giản là cho bạn thấy làm thế nào để xây dựng một regexp từ một chuỗi. Trong ví dụ trên nếu str = "/ u /" thì r sẽ trở thành/\/u \ // không phải là thứ bạn muốn, tôi tin bạn có thể tìm ra cách làm những gì bạn muốn –

1

Edit:

Tôi tìm thấy một cách tốt hơn

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

Câu trả lời cũ của tôi bên dưới:

Cố gắng làm cho nó một trường hợp hoặc câu lệnh if đi nếu họ muốn tìm kiếm không nhạy cảm hoặc tắt, vv

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' là một String. Tại sao không làm cho nó một Regrexp? Nếu bạn cần phải đi từ String để biểu thức chính quy một cách để làm như vậy là bằng cách tạo ra một đối tượng biểu thức chính quy mới:

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

Vì vậy, có lẽ,

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

là những gì bạn đang tìm kiếm.

Nhưng nhìn chung, tôi không nghĩ rằng bạn có thể chỉ đơn giản là "sử dụng chuỗi dưới dạng mẫu regexp", mặc dù tôi là người mới bắt đầu và có thể sai về điều này.

Các vấn đề liên quan