C#正则表达式和替换部分匹配

时间:2017-08-25 22:11:28

标签: c# regex string

所以我有一个正则表达式,它将查看一个字符串并匹配所有相对锚链接,如: Leaderboard

它与href以HTTP或HTTPS开头的位置不匹配。

表达式是:

<a.*?href="([^http]|[^https]).*?"[^<]

这部分现在很好。

然而,在我得到匹配后,我似乎无法弄清楚我想用routerLink替换href名称。

此:

<a href="/leaderboard">Leaderboard</a>

变为:

<a routerLink="/leaderboard">Leaderboard</a>

注意href现在是routerLink。

有20多场比赛,所以我不能简单地用排行榜替换我需要保持相对路径相同。从字面上看,匹配字符串中唯一被替换的是routerLink的href,该属性的值保持不变。

这部分给了我一个问题!

这里有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

虽然其他帖子已经已接受,但我想在没有正则表达式的情况下发布an alternative

Expression

Linq查询也可用于相同的 XPath

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

foreach(var a in doc.DocumentNode.SelectNodes("//a[@href]"))
{
    var href = a.Attributes["href"];
    href.Remove();
    a.Attributes.Add("routerLink", href.Value);
}

var newHtml = doc.DocumentNode.OuterHtml;

答案 1 :(得分:0)

您的模式并没有按照您的想法行事 - 如果您的模式href="halfway",会发生什么。你说的模式 <a.*?href="([^http]|[^https]).*?"[^<]分解为:

  1. 字面上找到字符<a
  2. 可选择跳过尽可能少的字符.*?以匹配
  3. 按字面匹配字符href="
  4. 接受不属于httph之一,t的字符,tps([^http]|[^https]) - 请注意,方括号[]中的字符列表代表一个匹配的字符。
  5. 可选择跳过尽可能少的字符.*?以匹配
  6. 按字面匹配字符"
  7. 匹配不是<
  8. 的字符

    虽然这个在线网站不会处理所有.Net正则表达式,但它会显示问题并解释一些匹配操作的工作原理:https://regex101.com/r/raoCcA/1

    这应该有效:

    var pattern = @"href=(?=""(?!http|https))";
    
    var ans = Regex.Replace(src, pattern, "routerLink=");
    

    如果需要,您可以尝试限制hrefa标记,但是对于正则表达式来说它开始变得太复杂了:

    var pattern = @"(?<=<a([^<>]|<!--|-->)+)href=(?=""(?!http|https))";