[英]C# Regex.Replace(): getting the values
我正在解析BB代碼圖片標簽:
[IMG] http://imagesource.com [/ IMG]
我正在使用以下Replace()函數:
Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase);
我需要在解析時獲取URL。 我需要知道“$ 1”的價值。 可能嗎? Regex類以某種方式用我需要的值替換“$ 1”字符串,因此必須有一種方法來獲取它。
聽起來你正在尋找帶有接受MatchEvaluator的重載的Replace
方法。 可以在此處找到該方法的MSDN頁面。
試試這個:
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
工作中重復使用。
順便說一句,我還通過刪除]
的轉義來略微簡化你的模式。 只有開口[
需要逃脫。
要保留捕獲的字符串,只需“捕獲”返回值。
string s = Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase);
捕獲組在Captures屬性中可用於Regex匹配,如果您執行匹配而不是替換,則您將可以訪問該組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.