繁体   English   中英

如何在.NET中使用Regex提取2个标记之间的字符串?

[英]How to extract string between 2 markers using Regex in .NET?

我有网页的来源,我需要提取正文。 </head><body></body></html>

我已经尝试了以下方法,但均未成功:

var match = Regex.Match(output, @"(?<=\</head\>\<body\>)(.*?)(?=\</body\>\</html\>)");

它会找到一个字符串,但会在</body></html>之前将其切断。 我基于正则表达式的转义字符小抄

我想念什么?

我建议改用HtmlAgilityPack-用正则表达式解析HTML非常非常脆弱。

最新版本甚至支持Linq,因此您可以获取如下内容:

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://stackoverflow.com");
string html = doc.DocumentNode.Descendants("body").Single().InnerHtml;

正如这里许多人所说的,正则表达式不是用于这种html处理的。 没有您的示例网页/ html,我只能说尝试删除非贪婪的内容? (.*?)量词并尝试。 毕竟,一个html页面只有一个头和身体。

尽管正则表达式绝对不是执行此任务的最佳工具,但我还是要提出一些建议和要点:

  1. 取消转义尖括号-在字符串之前使用@,它们将进入正则表达式,并且不需要为.NET正则表达式转义。
  2. 使用正则表达式时,您需要确保头部/身体标签组合之间没有任何空格。
  3. 对于您的正则表达式,body标签不能具有任何属性。

我建议更像:

(?<=</head>\s*<body(\s[^>]*)?>)(.*?)(?=</body>\s*</html>)

在此页面的源代码上,这似乎对我有用!

正如其他人所说,处理此问题的正确方法是使用特定于HTML的工具。 我只想指出该备忘单的一些问题。

首先,关于尖括号是错误的:您不需要将其转义。 实际上,这是错误的两次:它还说\\<\\>匹配单词边界,这对于.NET既不正确,又与转义尖括号的建议不兼容。

该备忘单只是正则表达式语法元素的随机集合; 它们中的大多数都可以在大多数口味下使用,但是无论发生什么情况,都可以保证许多产品都不能在您的特定口味下使用。 我建议您不要理会它,而应依赖于.NET特定的文档或Regular-Expressions.info 掌握正则表达式》和《 正则表达式食谱》这两本书也都很出色。

至于您的正则表达式,我不知道它如何表现出您所说的方式。 如果要失败,我希望它会完全失败。 您的HTML文档中是否包含CDATA部分或SGML注释,其中包含</body></html> 还是两个或多个HTML文档一起运行?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM