2011-02-15 3 views
2

나는 다음과 같은 형식으로 만든, 큰 텍스트 블록의 텍스트 영역을 캡처 찾고 있어요 :은 정규식은 멀티 라인 텍스트 영역 (C#)를 추출하는 데에 일치

... 
[region:region-name] 
multi line 
text block 
[/region] 
... 
[region:another-region-name] 
more 
multi-line text 
[/region] 

나는이 거의 함께 일했다

\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\] 

전체 텍스트에 하나의 영역 만있는 경우 작동합니다. 그러나 여러 개가있을 때, 이것은 저에게 하나의 블록을 주며 다른 모든 '지역'은 그 블록의 '텍스트'에 포함됩니다. 나는 이것이 네거티브 룩 어 헤드를 사용하여 해결된다는 느낌이 들지만, 정규 표현식을 사용하는 비 프로가되어서, 위와 같이 올바르게 수정하는 방법을 모르겠습니다. 누군가 도움을 줄 수 있습니까?

답변

4

당신은 내다없이이 작업을 수행 할 수 있습니다

\[region:(?'link'.*)\](?'text'(?s).*?)\[/region\] 

추가 ?* 정량 게으른한다, 그래서 것이다 가능한 한 적은 수의 문자와 일치해야합니다. (?s)은이 위치 다음에 도트가 개행 문자와 일치하도록 허용하므로 (.|[\r\n]) 구조를 사용할 필요가 없습니다 (대안은 [\s\S]).

+0

감사! 이것은 훌륭하게 작동했습니다. 또한 내 정규식을 청소 주셔서 감사합니다 :) – Sameera

1

당신은 부정적인 선견지명이 필요하지 않고 단지 (?'text'(.|[\r\n])*)을 "욕심이 많지 않은"것으로 변경하기 만하면 마지막 단계가 아닌 [/region]의 첫 번째 인스턴스와 일치하게됩니다. 당신은 *?를 추가하여이 작업을 수행 할 수 있으므로 그 결과 패턴은 다음과 같습니다

\[region:(?'link'.*)\](?'text'(.|[\r\n])*?)\[/region\] 
+0

고마워요! 위의 팀의 제안을 사용했지만 시도하지 않았습니다. 그러나 이것이 효과가 있었던 것처럼 보입니다. – Sameera

관련 문제