正则表达式在C#中替换自定义标签的麻烦

时间:2014-05-29 15:07:51

标签: c# html regex replace

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

基本上会有一个文本块可能包含以下一个或多个嵌入式伪标记,我需要使用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>

对于电子邮件伪标签,我提出了以下正则表达式,但它不起作用:

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

由于我坚持这个,我也没有在另一个上取得很大进展。

有什么想法我可以让这个工作?我总是在这些正则表达式的语法上挣扎......任何帮助或方向都会非常感激!!

2 个答案:

答案 0 :(得分:1)

一些指示:

  1. 看起来您正在尝试使用named capture groups。您可以使用(?<name>subexpression)
  2. 在正则表达式中创建其中一个
  3. 使用Regex.Replace访问指定的捕获组时,您可以使用${name}访问指定的捕获组。
  4. 除此之外,你非常接近。这里有两个正则表达式应该是一个很好的起点:

    链接:

    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

    编辑:已更新,以消除贪婪。

答案 1 :(得分:0)

在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\]") ) 

如果你愿意的话。