我正在寻找一个正则表达式来从一组 xml 文档中去除以下文档类型声明:
<!DOCTYPE refentry [ <!ENTITY % mathent SYSTEM "math.ent"> %mathent; ]>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook MathML Module V1.1b1//EN"
"http://www.oasis-open.org/docbook/xml/mathml/1.1CR1/dbmathml.dtd">
这是 stackoverflow 和其他地方的一个非常常见的问题,但实际上没有一个答案能够处理这两种情况。
我对 <!DOCTYPE((.|\n|\r)*?)(\"|])>
的幼稚做法将正确匹配第二种情况,但在第一种情况下失败(它在第一个 ">
处停止并使 %mathen; ]>
不匹配。)如果我尝试使正则表达式更贪婪,它会尝试消耗整个文档。
完整的测试用例:
最佳答案
编辑:修复了评论匹配,感谢 TheFiddler
好吧,你可以使用类似的东西(不是很漂亮);
<!DOCTYPE[^>[]*(\[[^]]*\])?>
它匹配 <!
以及 >
之前的一切或 [
, 后跟一个由 []
包围的可选部分, 然后是最后一个 >
.
更多细节;
<!DOCTYPE -- matches the string <!DOCTYPE
[^>[]* -- matches anything up to a > or [
(\[[^]]*\])? -- matches an optional section surrounded by []
> -- matches the string >
关于c# - 删除文档类型的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22733588/