如何在.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小抄表转义了字符。
我错过了什么?
我建议使用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页面将只有一个标题和正文。
虽然正则表达式绝对不是完成此任务的最佳工具,但我想提出一些建议和观点:
- 不转义尖括号-在字符串前加上@,它们将进入正则表达式,并且不需要为。net正则表达式进行转义
- 使用你的正则表达式,你需要确保头/体标签组合之间没有任何空白。
- 使用正则表达式,body标签不能有任何属性。
我建议这样写:
(?<=</head>'s*<body('s[^>]*)?>)(.*?)(?=</body>'s*</html>)
这似乎对我在本页的来源工作!
正如其他人所说,处理这个问题的正确方法是使用特定于html的工具。我只是想指出那张小抄的一些问题。
首先,尖括号是错误的:你不需要转义。事实上,它错了两次:它还说'<
和'>
匹配单词边界,这对于。net来说都是不正确的,并且与关于转义尖括号的建议不兼容。
这个备忘单只是一个随机集合的正则表达式语法元素;它们中的大多数适用于大多数口味,但许多不能适用于您的特定口味,无论它碰巧是什么。我建议你忽略它,而是依赖于。net特定的文档或Regular-Expressions.info。《掌握正则表达式》和《正则表达式食谱》这两本书也都很不错。
至于你的正则表达式,我不知道它怎么能像你说的那样工作。如果它要失败,我希望它完全失败。您的HTML文档是否包含CDATA部分或SGML注释,其中包含</body></html>
?还是两个或多个HTML文档一起运行?