c# - 删除文档类型的正则表达式

标签 c# xml regex doctype

我正在寻找一个正则表达式来从一组 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[^>[]*(\[[^]]*\])?>

它匹配 <!以及 > 之前的一切或 [ , 后跟一个由 [] 包围的可选部分, 然后是最后一个 > .

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 >

关于c# - 删除文档类型的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22733588/

相关文章:

javascript - c# mvc nreco HtmlToPdfConverter 问题将 html 文档转换为 pdf

c# - 使用 Xdocument 读取 XML

xml - 合并 XML 文件同时忽略重复元素

regex - 将多个正则表达式连接成一个正则表达式

ruby - 用正则表达式替换文本 Ruby Capybara

c# - 为什么 Dictionary.ContainsKey() 和 ToString() 会导致 GC Alloc?

c# - NHibernate Deleted 对象将被级联重新保存

css - 在 XSL-FO 中使用外部 CSS

android - 模拟器在特定布局时运行缓慢

java - 需要正则表达式帮助从格式 xxxxxx/x/xxxxx/xxx 中剥离字符串