无法在两个标签之间取出所有换行符,制表符和回车符

时间:2012-02-24 00:37:18

标签: c# regex

我已经为此工作了将近一天。但我无法从“>”中取出所有换行符,制表符和回车符和“<”

这是我正在阅读的示例XML文件:

                <Consequence_Note>
                    <Text>In some cases, integer coercion errors can lead to exploitable buffer
                        overflow conditions, resulting in the execution of arbitrary
                        code.</Text>
                </Consequence_Note>

和这个

<Consequence_Scope>Availability</Consequence_Scope>
                    <Consequence_Technical_Impact>DoS: resource consumption
                        (CPU)</Consequence_Technical_Impact>

我的目标是从这两个标记(&gt;和&lt;)中取出所有换行符,制表符和回车符。我唯一能做到的就是从“&gt;”中取出所有的/ n / t / r和“&lt;”当两个标签之间没有任何东西时。但是当两个标签之间还有其他字符时,我无法取出所有\ n \ t \ r \ n。

我需要有关如何使用正则表达式的帮助,该表达式将从“&gt;”中取出所有换行符,标记符和回车符和“&lt;”

例如:

                <Consequence_Technical_Impact>DoS: resource consumption
                    (CPU)</Consequence_Technical_Impact>

我想要的是:

<Consequence_Technical_Impact>DoS: resource consumption (CPU)</Consequence_Technical_Impact>

这是我的代码(我正在读取xml文件):

String file = @"C:\Documents and Settings\YYC\Desktop\cwec_v2.1\cwec_v2.1.xml";
var lines = File.ReadAllText(file);
var replace = Regex.Replace(lines, @">([\r\n\t])*?<", "><");
File.WriteAllText(file, replace);  

2 个答案:

答案 0 :(得分:1)

请勿使用regexp(RegEx match open tags except XHTML self-contained tags)解析html / xml!

为xtml使用XML阅读器或使用HtmlAgilityPack(或其他一些html工具)。

xml / html文档非常复杂,正则表达式并不总是(在某些情况下是肯定的,但并非一般)完成正确的工作。

答案 1 :(得分:0)

如果您首先使用XmlReader读取文档,它将默认从输入中删除换行符。那么你可以简单地用作者正确的设置把它写回来。

请参阅:http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.ignorewhitespace.aspx 请参阅:http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.newlinehandling.aspx

可能会构建一个正则表达式替代方案,但是对于包含CData,注释和其他构造的XML来说,它仍然会有很多问题,这些构造使XML难以解析。如果XML非常结构化,机器生成且不变,您可以创建一个正则表达式来修复它,但另一方面,您也可以修复生成器。最简单的正则表达式可能有效:

\s{2,} 

替换为

[ ]

删除任何长于一个字符的空格,并用一个空格替换它。不需要以不同的方式处理标记内的任何其他空格,这就是XMLReader默认应该做的事情。