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
没有像我预期的那样工作。
您应该考虑使用适当的工具来解析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%的安全性。