2009-07-02 2 views
0

마지막으로 정규 표현식을 사용해야했던 지 오래되었으므로 서둘러 뭔가를 성취하기 위해이 빠른 질문에 대한 빠른 대답을 얻을 수 있기를 바랍니다.정규식을 여러 단락 (.Net) 사이에 대체

:

Start 
A 
B 
C 
End  
Start 
A 
B 
C 
End Start 
A 
B 
C 
End 
Foo 
A 
B 
C 
Bar 

내가 라인 파이프 만 내 최종 결과가되도록 "시작"과 "끝"단어 사이에 나누기 교체 싶습니다

나는 다음과 같은 텍스트가 말
Start|A|B|C|End  
Start|A|B|C|End Start|A|B|C|End 
Foo 
A 
B 
C 
Bar 

대단히 감사합니다.

답변

5

그런 식의 구문 분석을 시작하면 더 이상 정규 표현식 영역이 아닙니다. XML과 비슷하게, 컨텍스트에 따라 동일한 문자를 다르게 처리해야하는 표현식은 정규 표현식보다 높은 언어 클래스입니다.

문자열을 직접 파고 들기위한보다 전통적인 접근 방식은이 상황에서 더 잘 작동합니다. 귀하의 예를 켰을 때, 원래의 문자열이 공백에 의해 분할되어 가정

, 당신은 단지 공백에 문자열을 분할, 당신은 토큰 대신 뉴 라인 사이의 파이프를 넣어 StartEnd 토큰 사이에있을 때 플래그를 설정할 수 있습니다.

+0

이 질문은 원래 질문에 대한 답변이지만 내 사례에 대해 좀 더 구체적으로 설명해야합니다. 현실은 2 단어 사이에만 임시 정규식을 적용해야한다는 것입니다. 실제로 "끝"과 "시작"사이에 2 줄 바꿈이 없을 수도 있습니다. "끝"과 "시작"사이에 아무 것도있을 수 있습니다. – Rene

+0

mmmm .... 이 질문에 대한 올바른 정보가 포함 된 새로운 질문을하고이 답변을 올바른 것으로 표시해야합니까? 어떻게해야합니까? 아니면 원본 게시물을 편집하고 올바른 대답이 아닌지 고려해야합니다 (실제로 한 지점에서 올바른 대답 이었지만). – Rene

+0

나는 그것을 올바른 답으로 표시하고 다른 질문을해야한다고 생각합니다. – SolutionYogi

1

정규식 :

(Start)[\n]*(A)[\n]*(B)[\n]*(C)[\n]*(End) 

가 교체 :

$1|$2|$3|$4|$5 

시작, 종료, A, B에 대한 정규식 심지어 자신의 값을 넣어 또는 수 있으며, 부분 C로 대체 할 수 있습니다 당신의 언어/정규 표현식 엔진에 따라 약간 다르다. 내가 무엇을 사용하고 있는지 말해 준다면 더 구체적 일 수있다.

+0

시작과 끝 사이에 예측 가능하고 일관된 수의 항목이있는 한이 작업이 가능합니다. – Welbog

+0

맞아, 나는 이것이 정규 표현식을위한 훌륭한 애플리케이션이 아니라는 것을 쉽게 인정할 것이다.임의의 수의 항목에 대해이 작업을 수행 할 수있는 방법이 있지만 정규식의 한계에 도달했습니다. –

1

제공하신 케이스에 해당합니다. 더 복잡한 작업에는 아무런 보장이 없습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End" + Environment.NewLine + 
        "Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End" + Environment.NewLine + 
        "Foo" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "Bar"; 

     Regex regex = new Regex(@"Start(\r\n[^\r\n(End)]*)*End", RegexOptions.Multiline); 
     string replaced = regex.Replace(s, AddPipes); 
     Console.WriteLine(replaced); 
     Console.ReadLine(); 
    } 

    static string AddPipes(Match m) 
    { 
     string x = m.ToString(); 
     return x.Replace("\r\n", "|"); 
    } 
} 
0

나는 Welbog에 동의한다. 나는이 상황에서 당신이 너무 많은 정규 표현식을 요구할 것이라고 생각한다. 나는 2 패스 방식을 추천 할 것이다. RegexBuddy에 따르면, 다음 인해 임의 길이의 대상 단락을 일치합니다

(Start)(\r\n)((.*)\2)+?(End) 

나는 Cr의 교환을 텍스트에 일치하는 단락을 뽑아 다음 간단한 정규식 또는 문자열 대체 기능을 사용하려면 위의 정규식을 사용 파이프에 문자 Lf.

관련 문제