我正在尝试获取“ul”列表,其中包含术语“[我的搜索文本]”。
我尝试使用下面的正则表达式,但它没有给我正确的输出,
<ul[^>]*>\s*?\w+?(.|\n).*(\[My search Text\]).*(.|\n).+</ul>
<ul><li>[My search Text] is required </li></ul>
<ul><li>[My edit Text] is not required </li></ul>
<ul><li><b>[My search Text] is mandatory </b> </li> </ul>
<ul><li><strong>[My search Text] is so mandatory </strong> </li></ul>
<ul><li>[My search Text] is required </li></ul>
<ul><li><b>[My search Text] is mandatory </b> </li> </ul>
<ul><li><strong>[My search Text] is so mandatory </strong> </li></ul>
提前致谢
答案 0 :(得分:1)
关于你的正则表达式的说明:
<ul[^>]*>
- 应该可以正常工作,\s*?
- 无需使用延迟量词\w+?
- 同样,不需要进行延迟匹配,(.|\n)
- 这没有意义,因为它匹配任何符号一次.*
- 尽可能多地使用换行符以外的0个或多个字符(\[My search Text\])
- 文字[My search Text]
.*(.|\n)
- 与上述相同.+
- 换行符以外的1个或多个字符</ul>
- 文字</ul>
。你可以看到在这个正则表达式中你没有真正的多线支持。由于大量.*
需要大量的回溯,因此效率非常低。
我会安装HtmlAgilityPack并使用以下方法:
public List<string> HtmlAgilityPackGetTagOuterHTMLbyXpath(string html, string xpath)
{
HtmlAgilityPack.HtmlDocument hap;
var results = new List<string>();
Uri uriResult;
if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp)
{ // html is a URL
var doc = new HtmlAgilityPack.HtmlWeb();
hap = doc.Load(uriResult.AbsoluteUri);
}
else
{ // html is a string
hap = new HtmlAgilityPack.HtmlDocument();
hap.LoadHtml(html);
}
var nodes = hap.DocumentNode.SelectNodes(xpath);
if (nodes != null)
{
foreach (var node in nodes)
results.Add(node.OuterHtml);
}
return results;
}
使用这两个XPath中的一个应该返回3 <ul>
个节点:
//li[contains(., 'My search Text')]/ancestor::ul[1]
//ul[.//li[contains(., 'My search Text')]]
像这样:
var res = HtmlAgilityPackGetTagOuterHTMLbyXpath(s, "//li[contains(., 'My search Text')]/ancestor::ul[1]"");
答案 1 :(得分:0)
尝试:(对于ui中的文字)
<ul>*.+(\[My search Text\]).+</ul>
表示li里面的文字:
<ul>*.<li>*.+(\[My search Text\]).+<\/li>*.*<\/ul>