nit*_*hin 3 java regex xml string regular-language
我正在尝试处理一个 xml,在此之前我需要从输入 xml 中删除文档类型和实体声明。
我正在使用以下代码删除文档类型和实体:
fileContent = fileContent.replaceAll("<!ENTITY ((.|\n|\r)*?)\">", "");
fileContent = fileContent.replaceAll("<!DOCTYPE((.|\n|\r)*?)>", "");
Run Code Online (Sandbox Code Playgroud)
这将删除实体,然后删除文档类型。如果 xml 在 xml 中包含以下 doctype 声明,这将正常工作:
<!DOCTYPE ichicsr SYSTEM "http://www.w3.org/TR/html4/frameset.dtd">
<!DOCTYPE ichicsr SYSTEM "D:\UPGRADE\NTServices\Server\\Xml21.dtd"
[<!ENTITY % entitydoc SYSTEM "D:\UPGRADE\NTServices\Server\\latin-entities.dtd"> %entitydoc;]>
Run Code Online (Sandbox Code Playgroud)
但是如果我有下面给出的文档类型,它就不起作用并且 xml 中的根标记被剥离:
<!DOCTYPE ichicsr SYSTEM "D:\UPGRADE\NTServices\Server\\Xml21.dtd"
[<!ENTITY % entitydoc SYSTEM 'D:\UPGRADE\NTServices\Server\\Xml21.dtd'>
]>
Run Code Online (Sandbox Code Playgroud)
如果我使用的正则表达式不正确或需要采取任何其他措施,请告诉我。
您的方法不起作用,因为您在正则表达式中的"final 之前需要。你可以用那里代替。>ENTITIY\"['\"]
此外,切勿(.|\n|\r)*?在任何正则表达式中使用,因为它是性能杀手。相反,使用.*?with Pattern.DOTALL(或内联(?s)变体),或至少使用[\s\S]*?.
但是,有一个更好的方法:将两个正则表达式合并为一个:
fileContent = fileContent.replaceAll("(?i)<!DOCTYPE[^<>]*(?:<!ENTITY[^<>]*>[^<>]*)?>", "");
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示。
细节
(?i)- 不区分大小写的Pattern.CASE_INSENSITIVE内联修饰符<!DOCTYPE - 文字[^<>]*- 除了<和之外的 0+ 个字符>(?:<!ENTITY[^<>]*>[^<>]*)? - 一个可选的出现
<!ENTITY[^<>]*- 除了<和之外的 0+ 个字符>>- 一个>字符[^<>]*- 除了<和之外的 0+ 个字符>>- 一个>字符。| 归档时间: |
|
| 查看次数: |
891 次 |
| 最近记录: |