2017-02-07 36 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 (?:[^>] |(?