2014-03-29 72 views
4

我要尋找一個正則表達式從一組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"> 

這是計算器和其他地方的一個很常見的問題,但沒有一個答案是實際上能夠處理這兩種情況。

我的<!DOCTYPE((.|\n|\r)*?)(\"|])>幼稚的方法將正確匹配第二種情況,但不能放在了第一位(它停靠在第一">和葉%mathen; ]>無法比擬的。)如果我試圖讓正則表達式更貪婪,它試圖消耗整個文件。

完整的測試情況:

回答

4

編輯:修正了評論比賽,感謝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 > 
+0

如果文檔中有>和其他地方的順序,那麼您的貪婪匹配會匹配得太多。另外,即使它運作起來,貪婪的比賽也必須回溯。最好使用懶惰的比賽。 – ErikE

+0

這也將匹配文件內的註釋(請檢查我的問題中的xml測試文件。)但是,對' [] *(\ [[^]] * \])>的小改動似乎可以作爲預計,所以除非有人有更好的答案,我會接受:) –

+0

@TheFiddler啊,是的,錯過了。更新了答案。 –