2011-09-14 2 views
1

내에서 여러 결과를 일치 I 다음 문자열이 있습니다루비 정규 표현식 - 때 마크 업

nothing to match 
<- 
this rocks should match as should this still and this rocks and still 
-> 
should not match still or rocks 
<- no matches here -> 

을 그리고 난 '아직도' '바위'와 모두 일치하는 항목을 찾으려면,하지만 그들은 < 내에있는 경우 - - >

목적은 용어 사전을 마크 업하지만 편집기에서 정의한 텍스트 영역에만 마크 업할 수 있습니다.

내가 현재 가지고 :

<-.*?(rocks|still).*?-> 

이 불행하게도 첫 번째 '바위'와 일치하고 Rubular

사용법에 나는이이 이후의 모든 인스턴스와 '아직

의 전부를 무시 이것의 일부가 될 것입니다

Regexp.new('<-.*?(' + self.all.map{ |gt| gt.name }.join("|") + ').*?->', Regexp::IGNORECASE, Regexp::MULTILINE) 

어떤 도움을 미리 주셔서 감사합니다

답변

1

하나의 정규식으로이 작업을 수행하는 방법이 있지만 두 단계로 수행하는 것이 더 간단 할 것입니다. 당신은 아마 중첩 된 마크 업 (<-...<-...->...->)와이 결코없는 경우 그 정규식은 더 여기 만 좋은 솔루션입니다주의해야한다,

text = <<END 
nothing to match 
<- 
this rocks should match as should this still and this rocks and still 
-> 
should not match still or rocks 
<- no matches here -> 
END 

text.scan(/<-.*?->/m).each do |match| 
    print match.scan(/rocks|still/), "\n" 
end 

을 또한 : 먼저 용어집 단어를 마크 업을 검색 한 다음 마크 업의 모든 일치하고, <- 또는 ->은 마크 업의 내부인지 외부인지 여부에 관계없이 탈퇴했습니다.

1

Ruby 문자열 메소드를 잊지 마세요. 정규 표현식을 고려하기 전에 먼저 사용하십시오.

$ ruby -0777 -ne '$_.split("->").each{|x| x.split("<-").each{|y| puts "#{y}" if (y[/rocks.*still/]) } }' file 
0

루비에서는 정규 표현식으로 무엇을 할 것인가에 따라 다릅니다. 정규 표현식을 문자열과 비교하면 String methods이 사용됩니다. 이 중 일부는 모든 경기에 영향을 미칩니다 (예 : gsub 또는 rpartition). 다른 플레이어는 첫 번째 경기에만 영향을 미칩니다 (예 : rindex, =~).

첫 번째 일치 항목 만 반환하는 후자를 사용하는 경우 특정 오프셋부터 시작하여 메서드를 다시 호출하는 루프를 사용하는 것이 좋습니다. 예를 들면 :

# A method to print the indices of all matches 
def print_match_indices(string, regex) 
    i = string.rindex(regex, 0) 
    while !i.nil? do 
    puts i 
    i = string.rindex(regex, i+1) 
    end 
end 

(예, 먼저 분할을 사용할 수 있습니다,하지만 난 전술과 같은 정규식 루프가 적은 시스템 자원을 필요로 기대합니다.)