regex to remove doctype
c#, doctype, regex, xml
Solution
EDIT: Fixed the comment match, thanks TheFiddler
Well, you could use something like (the not entirely beautiful);
<!DOCTYPE[^>[]*(\[[^]]*\])?>
It matches a `<!` and everything up to a `>` or `[`, followed by an optional section surrounded by `[]`, followed by a final `>`.
A JSfiddle to test with.
More detail;
<!DOCTYPE -- matches the string <!DOCTYPE
[^>[]* -- matches anything up to a > or [
(\[[^]]*\])? -- matches an optional section surrounded by []
> -- matches the string >
Problem
I am looking for a regex to strip the following doctype declarations from a set of xml documents: ``` <!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"> ``` This is a very common question on stackoverflow and elsewhere, but none of the answers are actually able to deal with both cases. My naive approach of `<!DOCTYPE((.|\n|\r)*?)(\"|])>` will correctly match the second case, but fail on the first one (it stops at the first `">` and leaves `%mathen; ]>` unmatched.) If I try to make the regex more greedy, it tries to consume the whole document instead. Complete test cases: - first - second