我想在我的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
没有按照我的预期工作。
答案 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%的安全性。