[ruby] 문자열을 정규식으로 보간

Ruby의 정규 표현식으로 문자열 값을 대체해야합니다. 이 작업을 수행하는 쉬운 방법이 있습니까? 예를 들면 다음과 같습니다.

foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 
if goo =~ /value of foo here dynamically/
  puts "success!"
end



답변

문자열 삽입과 동일합니다.

if goo =~ /#{Regexp.quote(foo)}/
#...


답변

있습니다 Regexp.quote에서 존 L.의 대답은 중요하다!

if goo =~ /#{Regexp.quote(foo)}/

“명백한”버전을 사용하는 경우 :

if goo =~ /#{foo}/

일치하는 텍스트의 마침표는 정규식 와일드 카드로 취급 "0.0.0.0"되며 일치 "0a0b0c0"합니다.

하위 문자열 일치를 확인하려는 경우 간단하게 수행 할 수 있습니다.

if goo.include?(foo)

특수 문자에 대한 추가 인용이나 걱정이 필요하지 않습니다.


답변

아마도 Regexp.escape(foo)시작점이 될지 모르지만보다 일반적인 표현식 보간을 사용할 수없는 좋은 이유가 "my stuff #{mysubstitutionvariable}"있습니까?

또한 !goo.match(foo).nil?리터럴 문자열과 함께 사용할 수도 있습니다 .


답변

Regexp.compile(Regexp.escape(foo))


답변

Regexp.new를 사용하십시오.

if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/


답변

다음은 제한적이지만 유용한 다른 답변입니다.

입력 문자열에 작은 따옴표를 사용하면 Regexp.quote 또는 Regexp.escape를 사용하지 않고 정규식에 쉽게 삽입 할 수 있음을 발견했습니다. (IP 주소 일치)

IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key 
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0") 
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"

작은 따옴표는 \\ 및 \ ‘만 해석합니다.

http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes

이것은 정규 표현식의 동일한 긴 부분을 여러 번 사용해야 할 때 도움이되었습니다. 보편적이지는 않지만 질문의 예에 맞습니다.


답변

foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/