C#Regex.Replace():获取值

时间:2010-10-14 15:44:48

标签: c# regex replace

我正在解析BB代码图片代码:

  

[IMG] http://imagesource.com [/ IMG]

我正在使用以下的Replace()函数:

Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase);

我需要在解析时获取URL。我需要知道“$ 1”的价值。可能吗? Regex类以某种方式用我需要的值替换“$ 1”字符串,因此必须有一种方法来获取它。

3 个答案:

答案 0 :(得分:7)

听起来你正在寻找带有接受MatchEvaluator的重载的Replace方法。可以找到该方法的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工作中重复使用。

BTW,我还通过删除]的转义来略微简化了你的模式。只需要转发开头[

答案 1 :(得分:0)

要保留捕获的字符串,只需“捕获”返回值。

 string s = Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase); 

答案 2 :(得分:0)

捕获组在Captures属性中可用于Regex匹配,如果您进行匹配而不是替换,那么您将有权访问该组。