2012-10-30 2 views
1

C# 응용 프로그램에서 정규 표현식을 작성하여 "{value}"를 찾고, "[["까지의 텍스트에 대한 역 참조와 그것까지 "]]".역 참조를 사용하는 정규 표현식

This is some text [[backreference one {value} 
backreference two]] 

"["TWO] nbackreference \ R \ [역 참조 하나 ","{} 값 ", 및]"와 일치 것이다 : 예를 들어.

행운이없는 다음 버전을 수정했습니다. 나는 단어 경계가 누락되어 있다고 생각하며, 찾으려고하는 "{"때문에 문제가있을 수 있습니다. 이 정규 표현식 가능할 것이다 경우

\[\[(^[\{value\}]+)\{value\}(^\]\]+)\]\] 

는 잘 모르겠지만, 그것은 예를 들어, "찾을 것이라고 다음과 일치하는 닫는 브래킷을 찾을 수 있다면 이상적 일 것이다 [[backreferenc [[전자]

\[\[(.*)({value})(.*)\]\] 
: 당신의 첫 번째 부분으로
This is some text [[backreferenc[[e]] one {value} 
ba[[ckref[[e]]rence t]]wo]] 
+0

을 실제 예를 들어 주시겠습니까? –

+0

기본적으로 값이없는 경우 레이블을 제거하는 구문을 허용하려고합니다. 따라서 다음에서 {name} 및 {address}을 (를) 대체하고 {address}이 (가) 비어 있으면 "주소 :"가 표시되지 않습니다. [[이름 : {이름} \ r \ n]] [[주소 : {주소}]]. 그래서 현재 {address}를 빈 문자열로 대체하고 있지만 {address} 대신 {[and until after after text]]까지의 텍스트와 함께 바꿀 수 있도록 수정하려고합니다. – Carl

답변

1

이 시도 질문 : 하나 ","{값} "및"바는 하시다]] "[[ckref [[전자는] t]가, 관세, 보험료]
+0

감사 합니다만, 불행히도 "{value}"까지 "not {value}"와 (과) 일치 시키려고하고 있으므로 위의 예는 다음 예에서 실패합니다. [[some {text {value}]] – Carl

+0

@ nunes7452 시도해보십시오. 하나 – Rafal

2

MatchEvaluator on Regex replace을 사용해야합니다. 또한 매칭 평가자 처리를 돕기 위해 성냥을 명명 된 캡처 그룹으로 나눠서 당신의 삶을 편하게 만듭니다. 설명하겠습니다.

MatchEvaluator의 역할은 일치 프로세스에서 C# 대리자를 중재하고 캡처 된 실제 일치를 검사하여 일치가 발생하면 교체해야 할 대상을 반환 할 수 있도록 허용하는 것입니다. 그렇게하면 필요에 따라 텍스트 처리를 수행 할 수 있습니다. 여기

은 기본적인 방법으로 섹션을 처리하는 기본 예제이지만, 구조는 비즈니스 로직을 추가 할 수있다 : 정규식의 결과가 교체

string text = @"This is some text [[Name: {name}]] at [[Address: {address}]]."; 

Regex.Replace(text, 
       @"(?:\[\[)(?<Section>[^\:]+)(?:\:)(?<Data>[^\]]+)(?:\]\])", 
       new MatchEvaluator((mtch) => 
       { 
        if (mtch.Groups["Section"].Value == "Name") 
          return "Jabberwocky"; 

        return "120 Main"; 

       })); 

은 다음과 같습니다

This is some text Jabberwocky at 120 Main.