2016-12-07 5 views
4

겹치는 일치를 포함하여 주어진 문자열 내에서 모든 일치를 찾고 싶습니다. 나는 어떻게 그것을 얻을 수 있 었는가? 긍정적 인 내다 내부 캡처겹치는 Regexp와 일치 찾기

# Example 
"a-b-c".???(/\w-\w/) # => ["a-b", "b-c", "c-d"] expected 

# Solution without overlapped results 
"a-b-c-d".scan(/\w-\w/) # => ["a-b", "c-d"], but "b-c" is missing 

답변

5

사용 :

"a-b-c-d".scan(/(?=(\w-\w))/).flatten 
# => ["a-b", "b-c", "c-d"] 

참조는

+0

23,516,

또는

은 복잡한 패턴, 완벽하게 작동합니다. [ "a", "b"], "" "abaca".scan (/ (? = (\ w) (? :(?! \ 1) (\ w)) \ a ","c "]]'. – sschmeck

+0

검사는 불필요 할뿐만 아니라 실제로 최종 결과에 해가됩니다. –

+1

... 또는 긍정적 인 lookbehind :''a-b-c-d '.scan (/ (? <= (\ w- \ w)) /). –

3

Ruby demo 내가 아닌 정규식 솔루션을 제안 :

"a-b-c-d".delete('-').each_char.each_cons(2).map { |s| s.join('-') } 
    #=> ["a-b", "b-c", "c-d"] 

또는

enum = "a-b-c-d".each_char 
a = [] 
loop do 
    a << "%s%s%s" % [enum.next, enum.next, enum.peek] 
end 
a #=> ["a-b", "b-c", "c-d"] 
+1

마지막 기술은 매우 깔끔합니다. –

+0

좋은 답변이지만, 나는 명시 적으로 regexp를 요구했습니다. 위의 패턴은 내 문제를 설명하기 위해 찾은 가장 단순한 패턴이었습니다. 실제로 사용하는 패턴은'(\ w) (? :(?! \ 1) (\ w)) \ 1'입니다. – sschmeck