正则表达式删除doctype

时间:2014-03-29 16:20:09

标签: c# xml regex doctype

我正在寻找一个正则表达式从一组xml文档中删除以下doctype声明:

<!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; ]>无法匹配。)如果我尝试使正则表达式更贪婪,它会尝试使用整个文档。

完成测试用例:

2 个答案:

答案 0 :(得分:5)

编辑:修正了评论匹配,感谢TheFiddler

嗯,你可以使用像(不完全漂亮)的东西;

<!DOCTYPE[^>[]*(\[[^]]*\])?>

匹配<!以及>[以及[]所包围的可选部分,后跟最终>

A JSfiddle to test with

更多细节;

<!DOCTYPE     -- matches the string <!DOCTYPE
[^>[]*        -- matches anything up to a > or [
(\[[^]]*\])?  -- matches an optional section surrounded by []
>             -- matches the string >

答案 1 :(得分:1)

我建议在RegEx下面

 <!DOCTYPE.*(\[[\s\S]*?\])?>

Try this link