我有一个HTML文件,我正在尝试从每个标记中检索有效的innertext。我使用正则表达式使用以下模式:
(?<=>).*?(?=<)
它适用于简单的innertext。但是,我最近遇到了以下HTML部分:
<div id="mainDiv"> << Generate Report>> </div>
<input id="name" type="text">Your Name->></input>
我不确定,如何使用正则表达式检索这些innertexts?有人可以帮忙吗?
由于
答案 0 :(得分:1)
这就是为什么你不使用正则表达式来解析html的原因。尽管你可以通过在正则表达式中使用反向引用来解决这个问题
(?<=<(\w+)[<>]*>).*?(?=/<\1>)
虽然那不总是因为
您的代码就像这个
一样简单HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
//InnerText of all div's
List<string> divs=doc.DocumentElement
.SelectNodes("//div")
.Select(x=>x.InnerText).ToList();
答案 1 :(得分:1)
我会使用解析器,但RegEx可以使用以下内容:
<([a-zA-Z0-9]+)(?:\s+[^>]+)?>(.+?)<\/\1>
然后您可以使用捕获组2获取内部文本。
答案 2 :(得分:1)
您可以随时删除HTML标记,这些HTML标记可以通过常规语法描述,而HTML则不能。替换“&lt; [a-zA-Z] [a-zA-Z0-9] * \ s *([a-zA-Z] + \ s * = \ s *(”|')(?(“| ')(?&lt; =)。|。)(“|')\ s *)* /?&gt;”with string.Empty。
该正则表达式应匹配任何有效的HTML标记。
编辑: 如果您不想获得连锁结果,可以使用“&lt;”而不是string.Empty然后由'&lt;'拆分因为'&lt;'在HTML中始终启动标记,不应该显示。或者你可以使用Regex.Replace的重载来获取委托并使用匹配索引和匹配长度(这可能会更加优化)。或者甚至更好地使用Regex.Match并从匹配的标签转到匹配的标签。 substring(PreviousMatchIndex + PreviousMatchLength,CurrentMatchIndex - PreviousMatchIndex + PreviousMatchLength)应该提供内部文本。