我有这样的日志文件:
<CL>
text sample1
<CL>
<CL>
<TR></TR>
</CL>
<CL>
<CL>
<CL>
<TR1></TR1>
</CL>
<CL>
text sample2
<CL>
text sample3
<CL>
<TR1>
<TR2></TR2>
</TR1>
</CL>
我需要编写返回的正则表达式 此文件中的有效xml。我需要这个结果:
<CL>
<TR></TR>
</CL>
<CL>
<TR1></TR1>
</CL>
<CL>
<TR1>
<TR2></TR2>
</TR1>
</CL>
这种变化对我不起作用:
<CL>[\s\S]*?(<CL>[\s\S]+?</CL>)
提前致谢。
答案 0 :(得分:2)
正如我所经历的那样,正则表达式对于XML文件验证,解析和阅读来说并不是那么好。
最好使用DOM PARSER解决方案解决此问题。他们中的大多数都有验证方法。 在php:http://php.net/manual/en/book.simplexml.php(很多工作)
或PHP简单HTML DOM解析器:http://simplehtmldom.sourceforge.net/(只需读取xml文件并打印从xml创建的对象,并获取有效的xml结构,因为我记得它不仅适用于HTML结构) 在java:JSOUP库http://jsoup.org/(与php中的simpledom几乎相同)
首先,有效的xml文件应包含根标记 (就像html文件中的HTML标记一样,包装文档)
我希望这可以帮助你
答案 1 :(得分:1)
此正则表达式适用于您的示例
"<CL>((?!<CL>).)*?(?:<TR[\\d]*?>)+.*?(?:</TR[\\d]*?>)+.*?</CL>"
注意,依赖于编程语言,您应该设置Singleline
正则表达式选项以使此正则表达式正常工作
编辑没有必要逃避\ d,所以也试试
"<CL>((?!<CL>).)*?(?:<TR[\d]*?>)+.*?(?:</TR[\d]*?>)+.*?</CL>"
EDIT2 如果您只想捕获cl标记内容,可以直接使用:
<CL>((?!<CL>).)*</CL>