我需要从某种链接中提取所有文本
<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+
作为“任意字符”
仍然没有成功
答案 0 :(得分:1)
是的,使用正则表达式来解析html是不好的,但如果你仍然需要它。
string text = Regex.Match(html, "(?<=<a[^>]*>).*?(?=</a>)", RegexOptions.IgnoreCase).Value;
我们希望在<a...>
和</a>
代码之间提取文字,因此我们对<a...>
代码使用正向lookbehind,对</a>
代码使用正向预告。文本本身匹配为.*?
。我们如何匹配<a...>
代码?取代...
可以是>
以外的任何内容,因此我们使用[^>]*
为我们制作<a[^>]*>
。然后我们将它包装成lookbehind表达式(?<=<a[^>]*>)
。 </a>
标记包含在超前表达式(?=</a>)
中。然后你将所有三个组合成一个。
答案 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();
}
}
}