문자열을 정규식으로 보간


160

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

foo가 goo의 하위 문자열인지 확인하려고합니까? 나는 당신이 무엇을 요구하는지 명확하지 않다고 생각합니다.
Neall

그렇다면 goo.include? (foo)로 충분합니다!
glenn mcdonald 2018 년

1
아니요, foo가 goo의 하위 문자열인지 확인하려고하지 않았습니다. 또한 캡처도 필요했기 때문에 include가 작동하지 않았습니다.
Chris Bunch

답변:



125

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

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

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

if goo =~ /#{foo}/

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

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

if goo.include?(foo)

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


3
.quote()문자열을 사용하여 정규 표현식을 작성하려는 경우 역순 (을 사용하지 않음 )도 유용 할 수 있습니다.
Jesse

"실제로 하위 문자열 일치를 확인하려면 if goo.include?(foo)존재 여부 확인에 관심이있을 때 간단하게 "=> 수행 할 수 있습니다 . String.gsub를 바꾸고 이미 사용하고 싶다면 Regexp.quote가 유일한 옵션 일 수 있습니다.
Isaac Betesh

명확하지 않은 경우 제시에 추가하기 만하면 이스케이프 할 필요가없는 문자열을 Regexp.new또는로 전달하는 것 Regexp.compile입니다.
dylankb

우리가 Regexp.quote 사용하려는 이유의 유용한 설명을 주셔서 감사합니다
Wylliam 주드

7

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

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




3

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

입력 문자열에 작은 따옴표를 사용하면 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

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


나는 내 게시물에 대해 어떻게 생각할 지 궁금하지만 지금까지 여기에서 볼 수 있을지는 의문입니다.
Plasmarob

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

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

2
아니요, 점은 정규식 와일드 카드이기 때문에 "여기에 다른 항목 070x0! 0"이 잘못되었습니다.
glenn mcdonald
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.