2012-05-10 15 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"はstringです。文字列から正規表現を構築するには、次の操作を行います。

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

Regexp.new( '/ asd/i')は(?-mix:\/asd \/i)のような正規表現を返しますか? – gkaykck

+0

@gkaykck結果は私のマシンでは同じではありませんが、私が強調したいのは、正規表現は文字列ではないということです。私は単に文字列から正規表現を構築する方法を示しています。上記の例では、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は、/ i」は文字列であるなど、その場合または文が渡す場合は作ってみましょう。なぜそれをRegrexpにしないのですか?あなたが正規表現に文字列から、そうするための1つの方法を行く必要がある場合は、新しい正規表現オブジェクトを作成することである:

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

は、あなたが探しているものです。

しかし、私は初心者でありながら、これについて間違っているかもしれませんが、全体的には私は単純に "文字列を正規表現パターンとして使う"とは思えません。

関連する問題