2016-10-25 2 views
0

패턴 목록이 있는데 해당 패턴과 문자열을 일치 시키려고하지만 전체 단어 만 일치시켜야하므로 단어 경계를 Regexp.union에 동적으로 삽입하는 방법을 찾고있었습니다. 방법 그러나 나는 무언가를 놓치고있다. 여기 내가단어 경계가있는 Regexp 공용어

test_string = "lonewolf is lonely" 
pattern_list = ["lonely", "wolf", "jungle"] 
pattern_list.collect! { |pattern| pattern = "\b" + pattern + "\b"} 
patterncollection = Regexp.union(pattern_list) 
puts patterncollection 
puts test_string.scan(patterncollection) 

결과가 비어 시도 무엇이고 나는 패턴 수집을 인쇄 할 경우 나는 "\ B는"제대로 탈출되지 않는 것을 알 수있다. 배열을 동적으로 검색 할 때 "\ b"를 배열에 직접 삽입 할 수 없습니다. 하나 이상의 옵션을 시도했지만 여전히 운이 없습니다. 문제에 대한 다른 접근 방식을 환영합니다.

답변

2

가장 쉬운 해결책은 노동 조합의 외부 단어 경계 매처 (matcher)를 이동하는 것입니다 :

/\b(#{Regexp.union(pattern_list).source})\b/ 

▶ "lonewolf is lonely".scan /\b(#{Regexp.union(%w|lonely wolf jungle|).source})\b/ 
#⇒ [ 
# [0] [ 
#  [0] "lonely" 
# ] 
# ] 

는 아래의 중요한 주석을 참조하시기 바랍니다. 기본적으로, "절대적으로 긍정적 인 경우가 아니면 어떤 소스가 사용되는지 알려줍니다. - 양철통 ".

그에 따라 답변이 업데이트되었습니다.

+0

Perfect! 고맙습니다! – Jack

+0

'Regexp.union'을 사용할 때와 같이 정규 표현식을 정규 표현식에 포함시키는 것에주의하십시오. [/ fo # {Reinxp.union ([ 'O', 'B'])}/혼합] # => nil'하지만''foo '[/ FO # {Re ','B ']). source}/mix] # => "foo"'. 무슨 일이 일어날 지 당신이 절대적으로 긍정적이지 않다면'source'를 사용하십시오. –

+0

@ theTinMan 감사합니다. 답변을 업데이트했습니다. 이 특정 입력에 대해서는 아무런 문제가 없지만 모서리의 경우를 언급 할만큼 가치가 있다는 것에 전적으로 동의합니다. – mudasobwa