C#Regex.Replace():获取值

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

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

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

Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"", 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 @""; }, RegexOptions.IgnoreCase); 

这使用多语句lambda来简化组的工作并在返回替换值之前执行更多逻辑。 当然,你可以侥幸逃脱:

 string result = Regex.Replace(input, pattern, m => @"", RegexOptions.IgnoreCase); 

在上面的例子中,没有必要return但它只是返回原始字符串而无需额外的评估。 您可以粘贴一些三元运算符并添加该逻辑,但它看起来会很混乱。 多语句lambda更清晰。 您可以考虑使用自己的方法将其分解,如前面提到的MSDN链接所示,如果它太大或将在其他Regex.Replace工作中重复使用。

顺便说一句,我还通过删除]的转义来略微简化你的模式。 只有开口[需要逃脱。

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

  string s = Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"", RegexOptions.IgnoreCase); 

捕获组在Captures属性中可用于Regex匹配,如果您执行匹配而不是替换,则您将可以访问该组。