[英]Regex.Split returning whitespaces
我想将视图作为HTML文档导出到ASP.NET页上的用户。 我想提供仅获取部分视图的选项。
因此,我想用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
不能按我预期的那样工作。
您应该考虑使用诸如HtmlAgilityPack之类的适当工具来解析HTML。
当前的问题是关于Regex.Split
为什么返回3个值。 这是由于您的模式中存在捕获组。 Regex.Split
返回字符串的开始/结束与匹配的块之间的块, 以及所有捕获的子字符串:
如果在Regex.Split表达式中使用了捕获括号,则任何捕获的文本都将包含在结果字符串数组中。 例如,如果在捕获括号内的连字符上拆分字符串“ plum-pear”,则返回的数组将包含一个包含连字符的字符串元素。
因此, Regex.Split(text, @"<!--Graphic2-->(.|\\n)*<!--EndDiscarded-->")
匹配<!--Graphic2-->
子字符串,然后进行匹配并捕获进入第1组,尽可能多的出现0个字符,然后匹配<!--EndDiscarded-->")
-这些匹配项被删除,不匹配的子字符串被返回,但是捕获到最后一个字符重复捕获组也将返回。
因此,如果打算将正则表达式用于此任务,则应考虑将其重写为@"(?s)<!--Graphic2-->.*?<!--EndDiscarded-->"
或@"<!--Graphic2-->[^<]*(?:<(?!!--EndDiscarded)[^<]*)*<!--EndDiscarded-->"
效率会更高,甚至@"<!--Graphic2-->[^<]*(?:<(?!!--(?:EndDiscarded|Graphic2))[^<]*)*<!--EndDiscarded-->"
确保没有嵌套的Graphic2
注释匹配。
可以看到,当您要确保模式更有效,更安全地工作时,正则表达式的复杂性就会增加。 但是,即使这些较长的版本也不保证100%的安全性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.