gpt4 book ai didi

.net - 正则表达式匹配不在 HTML 注释中的任何内容

转载 作者:行者123 更新时间:2023-12-04 00:26:04 26 4
gpt4 key购买 nike

首先让我说我知道你永远不应该用正则表达式解析 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.*$

由于这极大地改变了问题并立即回答它,我不确定现在正确的协议(protocol)是什么......但除非提出更好的建议,否则我想我会将这个问题留几天,以防有人发生在我的正则表达式中查找错误,如果没有人这样做,我将自行回​​答并关闭问题。

最佳答案

如果匹配和匹配变得复杂,在某些情况下 a simple "trick"可以帮助:匹配你不想要的(在交替的左侧)|capture你需要什么。

你不想要的是评论:<!--.*?-->
或捕获任何字符,而不是开始打开评论:|((?:(?!<!--).)+) ( lookahead 防止跳过 <!-- )并抓取第一个捕获组的捕获。

(?s)<!--.*?-->|((?:(?!<!--).)+)

二手 (?s)对于 single-line mode (点也匹配换行符)。见 this demo at regexstorm .

在 PCRE 正则表达式中,它可以在不捕获组的情况下通过 use of (*SKIP)(*F) 完成动词( demo)。

关于.net - 正则表达式匹配不在 HTML 注释中的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42097865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com