C# Regex-如何进行html标记名替换标记

C# Regex-如何进行html标记名替换标记,c#,regex,C#,Regex,我正在尝试在html中替换令牌 我的未分类字符串有多个标记。例如,我想用标记替换name属性。但不管怎样,我的正则表达式都会替换所有的。下面是一个独立的例子 这是期望的输出 <div>username&nbsp;<<VS_USER_NAME>></div><div>&nbsp;</div><div>full name&nbsp;<<VS_USER_FULL_NAME>&g

我正在尝试在html中替换令牌 我的未分类字符串有多个
标记。例如,我想用标记
替换name属性。但不管怎样,我的正则表达式都会替换所有的
。下面是一个独立的例子

这是期望的输出

<div>username&nbsp;<<VS_USER_NAME>></div><div>&nbsp;</div><div>full name&nbsp;<<VS_USER_FULL_NAME>></div><div>&nbsp;</div><div>password&nbsp;<<VS_USER_PASSWORD>></div><div>&nbsp;</div><div>thanks</div>
用户名全名密码谢谢
代码:

static void Main(字符串[]args)
{
string text=“用户名[用户名]全名[全名]密码[密码]谢谢”;
字符串textTokenised=GetTokenisedText(文本,“VS_用户名”、“VS_用户名”、“VS_用户名”、“VS_用户名”、“VS_密码”);
}
私有静态字符串GetTokenisedText(字符串未加密,参数字符串[]令牌密钥)
{
foreach(tokenKey中的字符串tokenKey)
{
字符串string2=GetToken(tokenKey);
字符串string1=GetRegex(tokenKey);
untokenised=正则表达式替换(untokenised,string1,string2);
}
未经处理的返回;
}
私有静态字符串GetToken(字符串令牌密钥)
{
返回string.Format(“,tokenKey);
}
私有静态字符串GetRegex(字符串令牌密钥)
{
返回string.Format(“()]*e*)name=\“{0}\”([^>]*e*)>(*)”,tokenKey);
}

您的正则表达式在默认情况下是贪婪的。。您必须通过添加
使其不贪婪。使用以下命令:

return string.Format("()<input([^>]*e*)name=\"{0}\"([^>]*e*)>(.*?)</input>", tokenKey); 
                                                                ↑
returnstring.Format(“()]*e*)name=\“{0}\”([^>]*e*)>(.*),tokenKey);
↑

下面是一个示例,您可以使用
HtmlAgilityPack
执行相同的操作:

private static string GetTokenisedText(string untokenised, params string[] tokenKeys)
{
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(untokenised);
    var query = doc.DocumentNode.Descendants("input");
    foreach (var item in query.ToList())
    {
        var value = item.GetAttributeValue("name", string.Empty);
        if (!string.IsNullOrEmpty(value))
        {
           var token = tokenKeys.Where(p => p == value).FirstOrDefault();
           if (!string.IsNullOrEmpty(token))
           {
               item.NextSibling.Remove();
               var newNode = HtmlAgilityPack.HtmlTextNode.CreateNode(string.Format("{{{{{0}}}}}", token.ToUpper()));
               item.ParentNode.ReplaceChild(newNode, item);
           }
        }
    }
    return doc.DocumentNode.OuterHtml;
}
输出:

用户名{{VS_用户名}全名{{VS_用户名}密码{VS_用户名}谢谢

{{
}
在(X)HTML文档中是优于
的标记


右键单击解决方案时,可以使用“管理解决方案的NuGet软件包”菜单项安装HTMLAGILITPACK。

不要。不要使用正则表达式解析HTML。使用HTML语法分析器。希望与非语法分析器匹配(我也喜欢您的方法和HtmlAgilityPack:)请随意投票。还要注意的是,如果您有巨大的HTML页面,并且没有匹配项,那么使用
*?
regex可能会遇到灾难性的回溯。我已经见过好几次了,这就是为什么我建议使用替代品。
private static string GetTokenisedText(string untokenised, params string[] tokenKeys)
{
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(untokenised);
    var query = doc.DocumentNode.Descendants("input");
    foreach (var item in query.ToList())
    {
        var value = item.GetAttributeValue("name", string.Empty);
        if (!string.IsNullOrEmpty(value))
        {
           var token = tokenKeys.Where(p => p == value).FirstOrDefault();
           if (!string.IsNullOrEmpty(token))
           {
               item.NextSibling.Remove();
               var newNode = HtmlAgilityPack.HtmlTextNode.CreateNode(string.Format("{{{{{0}}}}}", token.ToUpper()));
               item.ParentNode.ReplaceChild(newNode, item);
           }
        }
    }
    return doc.DocumentNode.OuterHtml;
}