Regex.拆分返回的空白

本文关键字:空白 返回 拆分 Regex | 更新日期: 2023-09-27 18:26:39

我想将视图作为HTML文档导出到ASP.NET页面上的用户。我想选择只获得视图的一部分。

因此,我想用Regex.Split()来分割输出。我写了一个Regex,与我想删掉的部分相匹配。拆分后,我将两个输出部分重新组合在一起。

问题是,我得到了一个包含3个部分的列表,其中第二个部分包含" "。如何更改输出仅包含2个字符串的代码?

我的代码:

textParts = Regex.Split(text, @"<!--Graphic2-->(.|'n)*<!--EndDiscarded-->");
text = textParts[0] + textParts[1];

text包含HTML、CSS和jQuery代码。我在我想删掉的区块周围写了<!--Graphic2-->之类的评论。

编辑

我现在通过使用Regex.Replace()方法使其工作。但我仍然不知道为什么Split没有像我预期的那样工作。

Regex.拆分返回的空白

您应该考虑使用适当的工具来解析HTML,比如HtmlAgilityPack。

当前的问题是Regex.Split为什么返回3个值。这是由于在你的模式中存在一个捕捉组。Regex.Split返回字符串开始/结束与匹配块之间的块,所有捕获的子字符串:

如果在Regex.Split表达式中使用捕获圆括号,则捕获的所有文本都会包含在生成的字符串数组中。例如,如果将字符串"plumb-pear"拆分为位于捕获圆括号内的连字符,则返回的数组将包含一个包含该连字符的字符串元素。

因此,Regex.Split(text, @"<!--Graphic2-->(.|'n)*<!--EndDiscarded-->")匹配<!--Graphic2-->子字符串,然后匹配并将任何字符的任何0+次捕获到组1中,尽可能多,然后匹配<!--EndDiscarded-->")-这些匹配被删除,不匹配的子字符串被返回,但捕获到重复捕获组中的最后一个字符也被返回。

因此,如果您计划将regex用于此任务,您应该考虑将其重新写入@"(?s)<!--Graphic2-->.*?<!--EndDiscarded-->"@"<!--Graphic2-->[^<]*(?:<(?!!--EndDiscarded)[^<]*)*<!--EndDiscarded-->",这样会更高效,甚至可以写入@"<!--Graphic2-->[^<]*(?:<(?!!--(?:EndDiscarded|Graphic2))[^<]*)*<!--EndDiscarded-->",这样可以确保不匹配嵌套的Graphic2注释。

请看,当您希望确保您的模式更高效、更安全地工作时,regexp的复杂性会增加。然而,即使是这些更长的版本也不能保证100%的安全性。