RegEx:从链接中提取所有文本

时间:2014-04-05 18:22:32

标签: c# regex

我需要从某种链接中提取所有文本

<Aid="ctl00_ctl00_ctl00_BodyContent_ContentPlaceHolder1_MainContentPlaceHolder_ResourceHostControl1_resContainer_rptColumn1_ctl00_ctl00_wrapper_downNodesTable_ctl01_ToolsetLink1"href="/Orion/NetPerfMon/NodeDetails.aspx?NetObject=N:78">SFTP</A>

A和id的原因是我删除了所有\ t \ r \ n \ ans空格

我试过的表达式:

\<a.+?>([^\<]+) 

基本上我想提取我认为确定为的SFTP字:

>开头任何可能的字符,包括+ - 点逗号以</a>结尾

尝试使用expresso后

并浏览了这些值:

>(\w+)\</a> - I get two values [0] -  >SFTP</A> [1] - SFTP

它仅适用于没有任何特殊字符的单词

我的问题是我不知道&gt;里面可以有什么&LT;

尝试在.之前添加\w+作为“任意字符”

仍然没有成功

2 个答案:

答案 0 :(得分:1)

是的,使用正则表达式来解析html是不好的,但如果你仍然需要它。

string text = Regex.Match(html, "(?<=<a[^>]*>).*?(?=</a>)", RegexOptions.IgnoreCase).Value;

我们希望在<a...></a>代码之间提取文字,因此我们对<a...>代码使用正向lookbehind,对</a>代码使用正向预告。文本本身匹配为.*?。我们如何匹配<a...>代码?取代...可以是>以外的任何内容,因此我们使用[^>]*为我们制作<a[^>]*>。然后我们将它包装成lookbehind表达式(?<=<a[^>]*>)</a>标记包含在超前表达式(?=</a>)中。然后你将所有三个组合成一个。

Regular expression visualization

答案 1 :(得分:0)

如果您没有删除空格,可以使用XmlTextReader来避免尝试使用正则表达式解析XML时出现问题:

using System;
using System.Text;
using System.Xml;

namespace ConsoleApplication1
{
    class Program
    {

        static string GetText(string xmlFragment)
        {
            XmlTextReader tr = new XmlTextReader(xmlFragment, XmlNodeType.Element, null);

            while (tr.Read())
            {
                if (tr.NodeType == XmlNodeType.Text)
                {
                    return tr.Value;
                }
            }

            return "";
        }

        static void Main(string[] args)
        {
            string s = "<A id=\"ctl00_ctl00_ctl00_BodyContent_ContentPlaceHolder1_MainContentPlaceHolder_ResourceHostControl1_resContainer_rptColumn1_ctl00_ctl00_wrapper_downNodesTable_ctl01_ToolsetLink1\" href=\"/Orion/NetPerfMon/NodeDetails.aspx?NetObject=N:78\">SFTP</A>";
            Console.WriteLine(GetText(s)); // outputs "SFTP"
            Console.ReadLine();
        }
    }
}