2010-12-16 89 views
3

我必須處理有時包含非轉義&的XML數據,並且我無法讓生產者將其轉義爲&或放入CDATA部分。正則表達式來清理XML

現在我正在尋找一個正則表達式來替換&和& amp;如果它不是一個實體的一部分。例如:&(?!(amp | lt |))

不幸的是,我的編程環境只支持「擴展的POSIX 1003.2正則表達式」(見http://www.kernel.org/doc/man-pages/online/pages/man7/regex.7.html),它似乎缺少not操作符「!」需要在這裏。

任何想法如何制定必要的正則表達式?

+1

正確的「XML-ish」響應將通過驗證程序運行,並拒絕爲「未正確形成的XML」。令人遺憾的是,XML的設計者不允許這樣的事實,即在現實世界中,我們有時不得不忍受糟糕的輸入並使用它。 – Spudley 2010-12-16 10:03:26

+0

@Spudley:我實際上是通過驗證器來運行XML文件的。多數民衆贊成我是如何注意到畸形的部分。不幸的是,其產生無效XML的Microsoft產品和他們的「標準」似乎意味着「可選」。 – 2010-12-16 10:20:26

+0

呵呵。微軟呃?這個數字。 (越來越遠離主題,因爲商業支持是管理層爲購買微軟而經常付出的理由,所以我想知道MS是否準備爲您解決這個問題?當然不是。 – Spudley 2010-12-16 10:32:18

回答

4

橫向思維:將所有&替換爲&amp,然後用&apos(例如)替換全部&apos(etc)?您可以使用一組捕捉到的部分被放回 - &(apos)

0

而是尋找的東西,匹配你可以搜索的東西不匹配產生積極的正則表達式負正則表達式,類似的:

! ... &(?(amp|apos|quot|lt|gt);) 

我沒有讀過你鏈接的整個頁面,但我很確定它應該是可能的。