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

本文关键字:2个 之间 字符串 提取 Regex net | 更新日期: 2023-09-27 18:09:11

我有一个源到一个网页,我需要提取的身体。所以在</head><body></body></html>之间的任何值

我尝试了以下操作,但没有成功:

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

它找到一个字符串,但在</body></html>之前将其切断。我根据RegEx小抄表转义了字符。

我错过了什么?

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

我建议使用htmllagilitypack来代替——用正则表达式解析HTML是非常非常脆弱的。

最新版本甚至支持Linq,所以你可以像这样获取你的内容:

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

Regex不是用来处理这种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文档一起运行?