C# 仅替换HTML标记中的引号的正则表达式

C# 仅替换HTML标记中的引号的正则表达式,c#,asp.net,regex,html-agility-pack,C#,Asp.net,Regex,Html Agility Pack,我有以下字符串: <div id="mydiv">This is a "div" with quotation marks</div> 这是一个带引号的“div” 我想使用正则表达式返回以下内容: <div id='mydiv'>This is a "div" with quotation marks</div> 这是一个带引号的“div” 注意div中的id属性现在是如何被撇号包围的吗 如何使用正则表达式实现这一点 编辑:我并不是在寻找在

我有以下字符串:

<div id="mydiv">This is a "div" with quotation marks</div>
这是一个带引号的“div”
我想使用正则表达式返回以下内容:

<div id='mydiv'>This is a "div" with quotation marks</div>
这是一个带引号的“div”
注意div中的id属性现在是如何被撇号包围的吗

如何使用正则表达式实现这一点

编辑:我并不是在寻找在任何情况下都能处理每种边缘情况的灵丹妙药。我们都应该厌倦使用正则表达式来解析HTML,但是,在这种特殊情况下,出于我的特殊需要,正则表达式是解决方案……我只需要一些帮助来获得正确的表达式


编辑#2:Jens帮我找到了一个解决方案,但是任何随机来到这个页面的人都应该仔细考虑使用这个解决方案。在我的例子中,它是有效的,因为我对我将要处理的字符串类型非常有信心。我知道危险和风险,并确保你做到这一点。如果你不确定你是否知道,那么它可能表明你不知道也不应该使用这种方法。您已收到警告。

这可以通过以下方式完成:我认为您希望用
替换
的每个实例,即介于
之间的

因此,您在文件中查找每个
,在后面查找一个
。正则表达式看起来像:

(?您可以匹配:

(<div.*?id=)"(.*?)"(.*?>)

我知道你已经意识到使用正则表达式进行这种替换的危险性。我为那些寻找一种更“稳定”的方法的人添加了以下答案,如果你想有一个随着输入文档的变化而继续工作的解决方案的话

使用HTML Agility Pack(,),可以实现以下功能:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);

出于好奇,属性是否包含在单引号或双引号中有什么关系?我有一个类似的问题,答案是不要在这些类型的情况下使用正则表达式:正如上面dup问题的第一个答案一样,不要使用正则表达式来解析HTML@Cindyydnic只要使用
HtmlAgilityPack
.Google就可以了关于regex,我们不能做得更好。谢谢。我来试一试。如果标记中的引号字符串中有一个
,该怎么办?在您开始尝试修改regex以预测所有可能性之前,您可能想看看我犯了一个小错误。编辑以获得工作版本。=)虽然肯定有很多不必要的愤怒,但在大量的regex/html问题中提出的观点通常是正确的。当然,如果问题是“我需要在一些html上做一次,我保证它没有任何疯狂之处”,那么regex将是一个合理的方法。如果是大量HTML,您不确定所有内容都是简单的,您可能会将其应用于新的输入。。。你想让它工作。你想解析HTML。@Jefromi:我对regex雷区了解得够多了。我很欣赏这个社区是如何阻止一个新手玩regex fire的,但这感觉更像是用卷起的报纸砸狗的鼻子。然而,你绝对正确,这个问题应该更新为一个解释,我非常清楚我所要求的东西的危险性。
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);