2012-06-15 105 views
3

卡住我有我的數據庫包含的字段中的以下文字:用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>"); 

此解決方案已經過測試與您的輸入,但沒有嵌套報價。這將有點棘手。

編輯:使用嵌套引號檢查此解決方案後,它確實工作。你只需要重複調​​用它,直到不再有更換。第一次它將匹配外部報價並在替換內部保留內部報價完整。這樣做的示例代碼(未經測試):

// 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