如何使用C#替换锚标记文本?

时间:2019-02-28 15:20:20

标签: c# regex

我正在尝试使用正则表达式替换锚标记值

Regex.Match(link, @"<a [^>]*>(.*?)</a>").Groups[1].Value.ToString();会给我锚标签文本。

我尝试使用“正则表达式替换”,但是我无法替换确切的文本。

示例:

var link="<a href="">Sample text </a>";
           var requiredText="new Text";         
           Regex.Replace(link,"<a [^>]*>(.*?)</a>",requiredText);

请帮助我解决这个问题。

感谢您的提前帮助

2 个答案:

答案 0 :(得分:2)

您正在捕获组中的中间内容。

您可能要做的是捕获一个组中左右两侧的内容,并在替换中使用这两个捕获组$1$2

var link=@"<a href="">Sample text </a>";
var requiredText="$1new Text$2";
link = Regex.Replace(link,"(<a [^>]*>).*?(</a>)",requiredText);
Console.WriteLine(link);
// <a href=">new Text</a>

查看C# demo

正则表达式将匹配:

  • (<a [^>]*>)捕获第1组
  • .*?匹配任何char 0次以上
  • (</a>)捕获第2组

答案 1 :(得分:0)

如果anchor标签的内容纯粹是文本(没有其他标签),则可以使用正向后看和前瞻实现。通过不使用锚点开始和结束标签,仅内容将被替换。

/(?<=>)[^<]*(?=<\/a>)/

Demo

string anchor = "<a href=\"\">Sample text </a>";
string requiredText = "new Text";
anchor = Regex.Replace(anchor, @"(?<=>)[^<]*(?=<\/a>)", requiredText);
Console.WriteLine(anchor); // <a href="">new Text</a>

说明:

  • (?<=>)-与前面的右尖括号(向后看)匹配。
  • [^<]*-匹配并使用零个或多个不是尖括号的字符。
  • (?=<\/a>)-匹配后续的封闭锚标记(超前)。

NB:我们不需要知道在后面的外观中打开了哪个标签,因为闭合锚标签必须正在闭合最后打开的标签。