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>");
因为我在这个问题上卡住了,所以我在另一个问题上也没有多大进展。
有什么想法我可以让这个工作吗?我总是纠结于这些正则表达式的语法…任何帮助或指导将非常感激!!
几个指针:
- 看起来你正在尝试使用命名捕获组。您可以使用
(?<name>subexpression)
在正则表达式中创建其中一个 - 通过
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']") )