2017-03-22 4 views
0

여기에 내가 가지고 무엇을 여기정규 표현식의 보간 된 배열이 nil 대신 위치를 반환하는 이유는 무엇입니까? 내가 전무하거나 예외를 예상했을 것이다</p> <pre><code>lorem =~ /#{oops}/ # => 1 </code></pre> <p>:

lorem = 'Lorem ipsum dolor sit amet, co' 
# => "Lorem ipsum dolor sit amet, co" 
oops = ['oops'] 
# => ["oops"] 

을 시도거야.

분명히 그것은 문자열 배열의 첫 번째 항목을 받아들이고 일치시키는 것입니다. 'O'는 두 번째 문자 '로렘 입숨 ...'

나는 윈도우 7

답변

0

에 루비 2.3.3를 사용하고 내가 찾을 생각은 그것 :

irb(main):008:0> /#{oops}/ 
=> /["oops"]/ 

정규식 는 대괄호 안에있는 문자 중 하나를 찾은 패턴과 첫 번째 패턴이 일치하는 패턴, 즉 'Lorem ipsum'의 두 번째 위치에있는 'o'와 일치하는 패턴으로 평가합니다. . . '

찾았나요?

+2

더 확장하려면 보간 (내부 문자열 또는 정규식)이 보간되는 객체에서 '# to_s'를 호출하고이를 사용합니다. 네, 정답입니다. – ndn

+0

찾았지만 수정 사항을 찾지 못했습니다. 대답은 문제를 지적 할뿐 아니라 수정본을 제공하고 설명하기로되어 있습니다. –

1

정규 표현식에 배열을 포함 할 수 있지만 보간법을 직접 사용할 수는 없습니다. 알게 되듯이, 직접 보간하면 character class이되며, 요소의 모든 문자와 큰 따옴표와 쉼표가 일치합니다.

대신 사용

ary = ['a'] 
regex = Regexp.union(ary) # => /a/ 
/#{regex.source}/ # => /a/ 

ary = ['a', 'b'] 
regex = Regexp.union(ary) # => /a|b/ 
/#{regex.source}/ # => /a|b/ 

당신은 문서에 Regexp.unionsource에 대한 자세한 내용을보실 수 있습니다.

하지만 잠깐! 더있다! 일반적으로

당신은 자식 표현이 거짓 양성 안타를 하위 문자열 생성 갑자기 피하기 위해 해당 그룹에 원하는 : 정규식 엔진은 욕심 때문에

/foo#{regex.source}/ # => /fooa|b/ 

하는, 일치합니다 fooa 또는 b :

'fooa'[/foo#{regex.source}/] # => "fooa" 
'foob'[/foo#{regex.source}/] # => "b" 

대신 도움이 될 것입니다 :

/foo(?:#{regex.source})/ # => /foo(?:a|b)/ 

'fooa'[/foo(?:#{regex.source})/] # => "fooa" 
'foob'[/foo(?:#{regex.source})/] # => "foob" 

하지만 더있어!

: 문서에서

regex = Regexp.union(ary) # => /a|b/ 
/#{regex}/ # => /(?-mix:a|b)/ 

:

포함 된 정규 표현식은 당신이 관심을 지불하지 않는 경우 디버그 문제에 하드의 결과로 보간 할 때 보존 options 자체적를 유지

i, mx(? on-off) 구문을 사용하여 하위 표현식 수준에 적용 할 수 있습니다.이 경우 하위 메뉴에서 으로 설정하고 괄호로 묶인 표현의 경우 에서 해제합니다.외부 패턴은 대소 문자를 구분하지 일치에 대해 다른 옵션 말을 사용하는 경우

다음과 같은 일이 일어날 수 :

regex = /FOO/ 
'foo'[/#{regex}/i] # => nil 
당신은 외부 표현에 i 옵션을 수정 것이라고 생각할 것입니다

물건 그러나 여기에서 무슨 일이 일어나고있는 작업은 다음과 같습니다

/#{regex}/i # => /(?-mix:FOO)/i 

간단한 수정 식의 텍스트를 반환하지만 위의 예에서처럼 source 방법을 사용하는 것입니다 옵션의 설정 :

/#{regex.source}/i # => /FOO/i 
'foo'[/#{regex.source}/i] # => "foo" 

source는 항상 올바른 일이 아니다 사용하지만, 당신이 의도적으로에 포함 된 표현을 사용하려는 경우가있다 확실 할 때까지 많은 도움이 다른 옵션 세트. 이 시점에 이르면 해당 시점에 코드에 대해 잘 주석을 달아 미래의 사람 또는 코드를 상속받은 다른 사람이 무슨 일이 일어나는지 이해할 수 있도록하십시오. 그렇지 않으면 무슨 일이 일어나고 있는지 파악하는 데 며칠이 걸릴 수 있습니다.