我正在解析BB代码图片标签:
[IMG] http://imagesource.com [/ IMG]
我正在使用以下Replace()函数:
Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)
我需要在解析时获取URL.我需要知道"$ 1"的价值.可能吗?Regex类以某种方式用我需要的值替换"$ 1"字符串,因此必须有一种方法来获取它.
听起来你正在寻找Replace一个接受MatchEvaluator的重载方法.可以在此处找到该方法的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);
Run Code Online (Sandbox Code Playgroud)
这使用多语句lambda来简化组的工作并在返回替换值之前执行更多逻辑.当然,你可以侥幸逃脱:
string result = Regex.Replace(input, pattern,
m => @"<img src=""" + m.Groups[1].Value + @""" border=""0"" />",
RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,没有必要,return但它只是返回原始字符串而无需额外的评估.您可以粘贴一些三元运算符并添加该逻辑,但它看起来会很混乱.多语句lambda更清晰.您可以考虑使用自己的方法将其分解,如上述MSDN链接所示,如果它太大或将在其他Regex.Replace工作中重复使用.
顺便说一句,我还通过删除转义来略微简化你的模式].只有开口[需要逃脱.