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);
}
也使用捕获组来捕获标签的其他部分:
(<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)