2012-05-10 12 views
6

के साथ रूबी grep मैं regex पैटर्न के रूप में एक स्ट्रिंग के साथ 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') एक regex जैसे (? -mix: \/asd \/i) देता है? – gkaykck

+0

@gkaykck परिणाम मेरी मशीन पर समान नहीं है, फिर भी मैं जो तनाव देना चाहता हूं वह यह है कि एक regexp एक स्ट्रिंग नहीं है। मैं आपको बस एक स्ट्रिंग से regexp बनाने के लिए दिखा रहा हूँ। ऊपर दिए गए उदाहरण में यदि str = "/ u /" तो r/\/u \ // बन जाएगा जो आप नहीं चाहते हैं, मुझे विश्वास है कि आप यह जान सकते हैं कि आप क्या चाहते हैं –

1

संपादित करें:

मैं एक बेहतर रास्ता मिल गया

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 को एक तरह से ऐसा करने के लिए जाने के लिए की जरूरत है एक नया 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 

आप जो खोज रहे हैं है।

लेकिन कुल मिलाकर मुझे नहीं लगता कि आप "एक स्ट्रिंगक्स पैटर्न के रूप में एक स्ट्रिंग का उपयोग कर सकते हैं", हालांकि मैं शुरुआत करने वाला हूं और इसके बारे में गलत हो सकता हूं।