正则表达式替换为命名组和其他所有内容

时间:2014-11-04 17:13:04

标签: c# regex

想象一下,我有一个正则表达式,它应该捕获一个HTML链接并用另一个链接替换它。

正则表达式看起来像这样:

<a.+?href="(?'url'.+?)".*?>

它会匹配HTML标签:

<a href="http://www.google.com">

或者这个:

<a target="_blank" href="#top">

如果我现在打电话

regex.Replace(new MatchEvaluator(ReplaceUrl))

我会在命名组中获得参数匹配。

但Match.Groups集合不仅包含3个项目。

如何将整个比赛重新组合在一起,结果将是

<a href="http://www.EvulRulz.devil">

或者我是否真的需要将其他所有内容都放入命名组中?

感谢Jonesy(见下文我终于理解了Groups集合中索引的含义,

所有未命名的组都是从1开始编号。它们的出现顺序与正则表达式相同。

所以我的替换方法看起来像这样(基于我将实际适应的未经修改的正则表达式):

private static String ReplaceUrl(Match match)
{
    return (match.Groups[1].Value + "http://www.EvulRulz.devil" + match.Groups[2].Value);
}

1 个答案:

答案 0 :(得分:1)

使用捕获组来抓取标记的其他部分:

(<a.+?href=")([^"]+)("[^>]*>)

然后在替换中插入那些:

var pattern = @"(<a.+?href="")([^""]+)(""[^>]*>)";
var str = @"<a target=""_blank"" href=""#top"">";

var newUrl = "http://www.stackoverflow.com";
var newTag = Regex.Replace(str, pattern, "$1" + newUrl + "$3");

(我改变了你的基础正则表达式)