3

我有以下字符串:

<div id="mydiv">This is a "div" with quotation marks</div>

我想使用正则表达式返回以下内容:

<div id='mydiv'>This is a "div" with quotation marks</div>

注意 div 中的 id 属性现在是如何被撇号包围的?

我怎样才能用正则表达式做到这一点?

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

编辑 #2: Jens 帮助我找到了解决方案,但任何随机访问此页面的人都应该仔细考虑如何使用此解决方案。就我而言,它有效,因为我对我将要处理的字符串类型非常有信心。我知道危险和风险,并确保你这样做。如果你不确定你是否知道,那么它可能表明你不知道并且不应该使用这种方法。你已经被警告过了。

4

3 回答 3

2

我看到您意识到使用 Regex 进行此类替换的危险。如果您想要一个在输入文档更改时继续工作的解决方案,我已经为那些寻找更“稳定”的方法的人添加了以下答案。

使用 HTML Agility Pack ( project page , nuget ),这可以解决问题:

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 */);
于 2012-03-19T09:54:07.720 回答
2

这可以通过以下方式完成:我认为您想将a和 a"之间的每个实例替换为。<>'

因此,您在文件中查找每个",在后面查找 a <,在前面查找>. 正则表达式看起来像:

(?<=\<[^<>]*)"(?=[^><]*\>)

您可以根据自己的喜好替换找到的字符,也许使用Regex.Replace.

注意:虽然我发现 Stack Overflow 社区最友好和乐于助人,但在我看来,这些 Regex/HTML 问题的回答有点过于愤怒。毕竟,这里的这个问题并没有问“什么正则表达式匹配所有有效的 HTML,并且不匹配任何其他内容”。

于 2010-03-15T14:59:26.547 回答
0

你可以匹配:

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

并将其替换为:

$1'$2'$3
于 2010-03-15T15:03:16.310 回答