我正在解析BB代码图片代码:
[IMG] http://imagesource.com [/ IMG]
我正在使用以下的Replace()函数:
Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase);
我需要在解析时获取URL。我需要知道“$ 1”的价值。可能吗? Regex类以某种方式用我需要的值替换“$ 1”字符串,因此必须有一种方法来获取它。
答案 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匹配,如果您进行匹配而不是替换,那么您将有权访问该组。