繁体   English   中英

在C#中的html文档中,与该模式匹配的REGEX是什么?

[英]What is the REGEX to match this pattern in a html document in C#?

我真的不知道如何最好地做到这一点,我可以做相当简单的regex表达式,但是更复杂的regex表达式确实使我感到困惑。

以下内容出现在特定的HTML文档中:

<span id="label">
<span>
<a href="http://variableLink">Joe Bloggs</a>
now using
</span>
<span>
'
<a href="/variableLink/">Important Data</a>
'
</span>
<span>
on
<a href="/variableLink">Important data 2</a>
</span>
</span>

我需要提取两个“重要数据”点,并可能要花费数小时来研究正则表达式(我正在使用C#3.5中的.net正则表达式库)。

如前所述,正则表达式通常不是解析HTML,XML和好友的正确工具-考虑使用HTML或XML解析库。 如果您确实想要或必须使用正则表达式,则在许多情况下,以下内容将与标记的内容匹配,但在某些情况下仍可能失败。

<a href="[^"]*">(?<data>[^<]*)</a>

该表达式将匹配所有不以http://开头的链接-这是链接之间唯一可见的区别。

<a href="(?!http://)[^"]*">(?<data>[^<]*)</a>

下面使用HtmlAgilityPack 它在“标签” ID内的第二个或更高版本的链接中打印任何文本。 当然,修改XPath进行一些不同的操作相对简单。

    HtmlDocument doc = new HtmlDocument();
    doc.Load(new StringReader(@"<span id=""label"">
<span>
<a href=""http://variableLink"">Joe Bloggs</a>
now using
</span>
<span>
'
<a href=""/variableLink/"">Important Data</a>
'
</span>
<span>
on
<a href=""/variableLink"">Important data 2</a>
</span>
</span>
"));
    HtmlNode root = doc.DocumentNode;

    HtmlNodeCollection anchors;
    anchors = root.SelectNodes("//span[@id='label']/span[position()>=2]/a/text()");
    IList<string> importantStrings;
    if(anchors != null)
    {
        importantStrings = new List<string>(anchors.Count);
        foreach(HtmlNode anchor in anchors)
        importantStrings.Add(((HtmlTextNode)anchor).Text);
    }
    else
        importantStrings = new List<string>(0);

    foreach(string s in importantStrings)
        Console.WriteLine(s);

查找.NET的后向和前向语法,并使用该语法在HTML中查找锚标记。 该站点可能会为您提供帮助。 作为正则表达式的替代方法,您可以考虑使用System.Xml.XPath.XPathNavigator直接寻址这些节点。

我的Regex有点生锈,但是遵循以下内容可能会有所帮助(尽管可能需要进行一些微调):

(?<=\<a href="/variableLink[/]?"\>)(.*)+(?=</a>)
  <a\shref.*?"/variableLink/?">(.*)</a>

第一组包含锚点的名称。 经过Expresso测试。 适用于您提供的示例文本。
更新 :也适用于Snippy。

Regex regex = new Regex(@"<a\shref.*?""/variableLink/?"">(.*)</a>", RegexOptions.Multiline);
foreach (Match everyMatch in regex.Matches(sText))
{
  Console.WriteLine("{0}", everyMatch.Groups[1]);
}

输出:

Important Data
Important data 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM