2012-06-15 5 views
3

붙어 나는이 내 DB의 필드에 포함 된 다음 텍스트 :정기적 인 C#을 표현

[quote:5a7b87febe="mr smith"]This is some text. 

This is more text on another line.[/quote:5a7b87febe] 

내가으로, 위의 같은 인스턴스를 변환하는 정규 표현식을 구성하려합니다 :

<div><h4>Posted by mr smith</h4>This is some text. 

This is more text on another line.</div> 

지금까지 작성한 패턴은 둘러싸인 텍스트에 줄 바꿈이없는 경우 작동하지만 위 예제에서는 다른 줄에 텍스트가있는 경우 패턴이 일치하지 않습니다.

내가 지금까지 가지고있는 C# 코드는 다음과 같습니다

var exp = new Regex(@"(\[quote)(:\w+=\"")(.*?)(\""\])(.*?)(\[\/quote)(:\w+\])"); 
var str = exp.Replace(str, "<div><h4>Posted by $3</h4>$5</div>"); 

내가 그렇게 개폐 '인용'태그 사이에 표시 '어떤'문자를 처리하는 방법을 확실하지 오전 정규 표현식에서 쓰레기입니다.

가능하면 위 예제의 중첩 된 인스턴스를 처리하는식이 이상적입니다.

'quote :'태그 다음에 오는 일련의 문자는 매번 고유하며, 따옴표 안에있는 이름도 달라질 수 있습니다.

답변

5

열기 태그의 고유 번호와 일치 시키려면 Backreference을 사용해야합니다. 이런 식으로 뭔가가 당신을 위해 작동합니다 :

var regex = new Regex(@"\[(quote:[a-z0-9]+)(=""([^""]+)?"")?\](.*)\[/\1\]", RegexOptions.SingleLine); 
var str = regex.Replace(str, "<div><h4>Posted by $3</h4>$4</div>"); 

이 솔루션은 중첩 된 따옴표와 함께 귀하의 의견 테스트,하지만되었다. 조금 더 까다 롭습니다.

EDIT :이 솔루션을 중첩 된 따옴표로 검사하면 작동합니다. 교체가 더 이상 없을 때까지 반복적으로 호출해야합니다. 처음에는 외부 인용 부호와 일치하고 내부 인용 부호는 대체 안에 그대로 두십시오. 이 작업을 수행하기위한 샘플 코드 (테스트되지 않음) :

// Repeatedly call this replacement 
string last; 
do 
{ 
    last = str; 
    str = regex.Replace(str, "<div><h4>Posted by $3</h4>$4</div>"); 
} while (last != str); 
+0

'RegexOptions.SingleLine'? – Rawling

+0

예. 당신의 대답은 틀린 길이었습니다. SingleLine의 문서에서 : "단 일행 모드를 지정합니다. \ n을 제외한 모든 문자 대신 모든 문자와 일치하도록 도트 (.)의 의미를 변경합니다." – Richard

+0

충분히 공정 :) 어쨌든 내 표를 얻습니다. 이 질문은 유용한 정보를 남기지 않으므로 답변을 삭제하겠습니다. – Rawling

관련 문제