Regex.Split返回空格

时间:2015-12-14 12:38:38

标签: c# asp.net regex split

我想在我的ASP.NET页面上将View作为HTML文档导出到用户。我想提供只获取视图的一部分的选项。

因此我想用Regex.Split()拆分输出。我写了一个与我想删除的部分相匹配的正则表达式。拆分后,我再将2个输出部分组合在一起。

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

我的代码:

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

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

修改

我现在使用Regex.Replace()方法开始工作了。但我仍然不知道为什么Split没有按照我的预期工作。

1 个答案:

答案 0 :(得分:0)

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

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

  

如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。例如,如果你拆分字符串&#34; plum-pear&#34;在捕获括号内的连字符上,返回的数组包含一个包含连字符的字符串元素。

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

因此,如果您打算使用正则表达式执行此任务,则应考虑将其重新编写为<!--EndDiscarded-->")@"(?s)<!--Graphic2-->.*?<!--EndDiscarded-->",这将更有效,甚至@"<!--Graphic2-->[^<]*(?:<(?!!--EndDiscarded)[^<]*)*<!--EndDiscarded-->"确保没有匹配嵌套的@"<!--Graphic2-->[^<]*(?:<(?!!--(?:EndDiscarded|Graphic2))[^<]*)*<!--EndDiscarded-->"条评论。

请注意,当您希望确保模式更高效,更安全时,正则表达式的复杂性会上升。但是,即使这些较长的版本也不能保证100%的安全性。