Regex替换为命名组和周围的所有内容

本文关键字:周围 替换 Regex | 更新日期: 2023-09-27 18:29:17

想象一下,我有一个regex,它应该捕获一个HTML链接并用另一个链接替换它。

Regex看起来像这样:

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

它将匹配这样的HTML标签:

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

或者这个:

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

如果我现在打电话给

regex.Replace(new MatchEvaluator(ReplaceUrl))

我会在命名组中获得一个参数Match和。

但是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);
}

Regex替换为命名组和周围的所有内容

也使用捕获组来捕获标签的其他部分:

(<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");

(我稍微改变了你的基础Regex)