使用正则表达式获取包含特定文本的列表

时间:2015-11-17 10:59:31

标签: c# regex

我正在尝试获取“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>

提前致谢

2 个答案:

答案 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]"");

enter image description here

答案 1 :(得分:0)

尝试:(对于ui中的文字)

 <ul>*.+(\[My search Text\]).+</ul>

表示li里面的文字:

<ul>*.<li>*.+(\[My search Text\]).+<\/li>*.*<\/ul>