簡體   English   中英

C#Regex.Replace():獲取值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM