2017-02-07 34 views
3

讓我先說我知道你不應該用正則表達式解析HTML。我不是,我只是有一個角落案例,評論正在我的內容中找到自己的方式,但不幸的是,我無法改變這種情況。正則表達式不匹配任何HTML註釋

我一直在試圖爲.NET創建一個正則表達式模式,它會匹配任何不屬於HTML註釋的部分。例如:

foo<!--abc-->bar 

應該匹配「foo」和「bar」。

foobar 

應匹配「foobar」(沒有評論,所以匹配所有內容)。

<!--foo--> 

不應該產生任何匹配,因爲沒有什麼不在評論中。

我可以用正則表達式很容易地與正則表達式<!--.*?-->相匹配,但是根據我的程序規範,我不能在這種情況下簡單地刪除它們,我需要匹配任何不在註釋中的內容。我所能想到的或者在網上找到的每一種方式都試圖排除評論,最終會一起選擇所有東西(因爲評論的開始和結束不是比賽的開始和結束),或者發現不期望的匹配。例如:

foo<!--abc-->bar 

使用正則表達式((?!<!--.*?-->).)*(簡單地否定了通過使用負先行查找註釋正則表達式),我得到4個匹配:第一個是正確匹配「foo」的,但隨後的第二和第四匹配顯示爲空白字符串(我不知道爲什麼),第三個匹配是「! - abc - > bar」,因爲在技術上簡單地刪除「<」滿足條件。使最後一個*量詞懶惰似乎使它更糟糕,返回17空白字符串匹配。我已經嘗試了其他一些方法,比如使用負面評論來排除評論,但他們都陷入了類似的問題,我不知道如何解決。

我也嘗試了這個問題的接受答案的正則表達式:Regex to strip anything that isn't an html comment;但不幸的是,這包括<!---->部分的匹配評論,如果我正確地閱讀它,我不認爲它會匹配沒有評論的字符串。我試圖修改此解決這些問題對我的使用情況,但還沒有與任何成功...

編輯

從問題和退後一步之後重新思考我的我意識到我並不需要匹配所有不屬於評論部分的文本。我真的只需要知道在內容中的任何位置是否有任何非空白文本不是註釋的一部分,使用帶有SingleLine選項的Regex.IsMatch方法。爲此,下面的正則表達式應該做的伎倆:

(?!^(\s*<!--([^-]*|-[^-]*|--[^>]*)-->\s*)+$)^.*\S.*$ 

由於這個急劇變化的問題,並立即回答,我不太確定正確的協議是什麼,現在......但是,除非更好的東西是建議,我想我會讓問題在幾天之內公開,以防有人在我的正則表達式中發現錯誤,如果沒有人會自我回答並解決問題。

+0

好吧,如果你可以用'(?s)' –

+0

拆分,會更容易如果你實現PCRE.NET,你將可以使用'(* SKIP)(* F)'。使用.NET本機正則表達式,你不能這樣做。 –

+0

如果輸入中沒有標籤,那麼[[[>] +(?= <!| $)'](http://www.regexstorm.net/tester?p=%5b%5e%)圖3e%5D%2B%28%3F%3D%3C%7C%24%29&I = FOO%3C! - ABC - %3ebar%0D%0afoobar%0D 0A%%3C! - 富 - %3E (?:[^>] |(?