這聽起來像你正在尋找Replace
方法與接受MatchEvaluator的重載。該方法的MSDN頁面可以找到here。
試試這個:
string input = "[img]http://imagesource.com[/img]";
string pattern = @"\[img]([^\]]+)\[\/img]";
string result = Regex.Replace(input, pattern, m =>
{
var url = m.Groups[1].Value;
// do something with url here
// return the replace value
return @"<img src=""" + url + @""" border=""0"" />";
},
RegexOptions.IgnoreCase);
它使用多語句lambda來簡化與組的工作並返回替換值之前進行更多的邏輯。你可以,當然,擺脫這個代替:
string result = Regex.Replace(input, pattern,
m => @"<img src=""" + m.Groups[1].Value + @""" border=""0"" />",
RegexOptions.IgnoreCase);
在上述情況下,沒有必要爲return
,但它只是返回原始的字符串而無需額外的評估。你可以粘貼一些三元運算符並添加邏輯,但看起來很亂。多語句lambda更清晰。您可以考慮以自己的方法將其分解出來,如前面提到的MSDN鏈接所示,如果它太大或將在其他Regex.Replace
工作中重複使用。
順便說一下,我還通過刪除]
的轉義,稍微簡化了你的模式。只有開頭[
需要轉義。
使用正則表達式解析bbcode與使用正則表達式解析HTML具有相同的缺點,因爲它們都不是常規語言。請參閱http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454你應該看看使用bbcode解析器(快速谷歌搜索發現http: //bbcode.codeplex.com/例如) – 2010-10-14 15:48:14