c#中正则表达式替换自定义标签的问题

本文关键字:标签 问题 自定义 替换 正则表达式 | 更新日期: 2023-09-27 18:05:41

我有一个简单的编辑器,我允许人们更新网站上的部分文本。我允许使用几个伪标记,在实际呈现它们的内容时用html替换它们。我想使用正则表达式来定位这些标记,并用适当的html标记替换它们。

基本上会有一个文本块,可能有一个或多个以下嵌入的psuedo标签,我需要使用c#通过正则表达式替换:

[E]me@myemail.com[/E] 

需要变成

<a class='LinkText' href='mailto:me@myemail.com'>me@myemail.com</a>

[L text='My Link Text']www.google.com[/L]

需要变成

<a class="MyLinkClass" href="www.google.com">My Link Text</a>

对于电子邮件伪标签,我提出了以下Regex,但它不起作用:

Content = Regex.Replace(Content, @"'[E'](?(email)[^<>]+)'[/E']", "<a class='LinkText' href='mailto:?{email}'>?{email}</a>");

因为我在这个问题上卡住了,所以我在另一个问题上也没有多大进展。

有什么想法我可以让这个工作吗?我总是纠结于这些正则表达式的语法…任何帮助或指导将非常感激!!

c#中正则表达式替换自定义标签的问题

几个指针:

  1. 看起来你正在尝试使用命名捕获组。您可以使用(?<name>subexpression)
  2. 在正则表达式中创建其中一个
  3. 通过Regex.Replace访问命名抓包组时,可以通过${name}访问命名抓包组。

除此之外你已经很接近了。这里有两个正则表达式,它们应该是一个很好的起点:

链接:

string linkReplacement = 
    Regex.Replace(
        linkContent, 
        @"'[L text='(?<text>[^']*)''](?<link>[^']]*)'[/L']", 
        "<a class='MyLinkClass' href='${link}'>${text}</a>");

电子邮件:

string emailReplacement = 
    Regex.Replace(
        emailContent, 
        @"'[E'](?<email>[^']]*)'[/E']", 
        "<a class='LinkText' href='mailto:${email}'>${email}</a>");

示例: https://dotnetfiddle.net/nhsoJ9

Edit:更新删除贪心

在LINQPad中快速完成…

void Main()
{
    string s = 
    @"[E]me@myemail.com[/E]
    blagra
    shlarga";
    foreach ( Match m in Regex.Matches( s, @"'[E']('w+@'w+.'w+)'[/E']") )
    {
      string emailMatch = m.Groups[1].Value;
      string entireMatch = m.Groups[0].Value;
      string replacement = string.Format( @"<a class=""MyLinkClass"" href=""{0}"">My Link Text</a>", m.Groups[1] );   
      string newString = s.Replace( entireMatch, replacement );
      newString.Dump();
    }
}

第二个替换留给读者作为练习:);-)

你可以简化这行:

foreach ( Match m in Regex.Matches( s, @"'[E']('w+@'w+.'w+)'[/E']") )

:

foreach ( Match m in Regex.Matches( s, @"'[E'](.+)'[/E']") )