C# 正则表达式:从链接中提取所有文本

C# 正则表达式:从链接中提取所有文本,c#,regex,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:

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

<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>
它只对一个单词有效,没有任何特殊字符


我的问题是,我不知道>中可以包含什么是的,使用正则表达式解析html是不好的,但是如果您仍然需要它的话

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

string text=Regex.Match(html,(?).*(?=)”,RegexOptions.IgnoreCase.Value;
我们希望提取
标记之间的文本,因此我们对
标记使用正向查找,对
标记使用正向查找。文本本身匹配为
*?
。我们如何匹配
标签?代替
可以是除
以外的任何东西,因此我们使用
[^>]*
为我们制作
]*>
。然后我们把它包装成lookback表达式
(?)
标记被包装到前瞻表达式
(?=)
。然后你把这三个组合成一个


如果没有删除空格,可以使用,以避免使用正则表达式解析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();
        }
    }
}
使用系统;
使用系统文本;
使用System.Xml;
命名空间控制台应用程序1
{
班级计划
{
静态字符串GetText(字符串xmlFragment)
{
XmlTextReader tr=新的XmlTextReader(xmlFragment,XmlNodeType.Element,null);
while(tr.Read())
{
if(tr.NodeType==XmlNodeType.Text)
{
返回tr.值;
}
}
返回“”;
}
静态void Main(字符串[]参数)
{
字符串s=“”;
Console.WriteLine(GetText));//输出“SFTP”
Console.ReadLine();
}
}
}

阅读这个经典问题和答案
string text=Regex.Match(str,(?).*(?=)”,RegexOptions.IgnoreCase.Value
非常有用!!!谢谢,你有机会解释一下这是什么意思吗?@Light\u用户我添加了解释的答案。我不确定我能解释,因为如果“转换”为xml,xml应该对所有的开头和结尾都有效,还是无效?它确实有一个Yes,它需要有效的XML。如果您已经在标记上使用字符串操作,则可能会导致无效部分。我建议你继续尝试HTMLAgilitypack路线。我从作为源代码的页面中获得的输出是java脚本,它们最终会编写“生成的源代码”,我想对其进行解析,所以我使用“string _Doc=web_Browser1.DocumentText”来获得它,它是否有效?好吧,只要你考虑到其中的注释,那么你应该(至少大部分)得到它有效标记。HTMLAgilitypack应该能够容忍标记错误。
string text = Regex.Match(html, "(?<=<a[^>]*>).*?(?=</a>)", RegexOptions.IgnoreCase).Value;
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();
        }
    }
}