2012-05-10 1 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/내가 병합 할 수 있습니까? – gkaykck

4

갖는 무언가는 것은 그 자체와 동일하지 않습니다. /a/i은 Regexp이고 "https://stackoverflow.com/a/i"은 문자열입니다. 문자열에서 정규 표현식을 구성하려면 다음을 수행

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는/내가'String의 등, 그 경우 또는 문을 통과하면 만들어보십시오. 왜 그것을 Regrexp로 만들지 않겠습니까? 당신이 정규 표현식으로 문자열에서 그렇게하는 한 가지 방법을 이동해야하는 경우 새로운 정규 표현식 개체를 만드는 것입니다 :

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

은 당신이 찾고있는 것입니다.

하지만 전반적으로 저는 처음에는 초보자이긴하지만 단순히 "정규 표현식 패턴으로 문자열을 사용할 수 있습니다"라고 생각하지 않습니다.