我想使用Regex来检索此人及其地址。
结果如下:
所有Frank Anderson及其地址都在一个字符串列表中。
问题:
我面临的问题是,根据我的正则表达式,我无法检索出名为“Frank Andre Anderson”的第二个名字。
也可能是其他人可以拥有另一个名字。
谢谢!
string pFirstname = "Frank"
string pLastname = "Anderson";
string input = w.DownloadString("http://www.birthday.no/sok/?f=Frank&l=Anderson");
Match theRegex8 = Regex.Match(input, @"(?<=\><b>)" + pFirstname + "(.+?)" + pLastname + "</b></a></h3><p><span>(.+?<)", RegexOptions.IgnoreCase);
foreach (var matchgroup in theRegex8.Groups)
{
var sss = matchgroup;
}
我正在使用代码的当前结果是:
答案 0 :(得分:0)
您必须寻找类似
的内容(?<=>[^<]*<b>)Frank([^<]+)Anderson</b></a></h3><p><span>([^<]+)
在C#中,正则表达式声明将是
Match theRegex8 = Regex.Match(input, @"(?<=>[^<]*<b>)" + pFirstname + "([^<]+)" + pLastname + "</b></a></h3><p><span>([^<]+)", RegexOptions.IgnoreCase);
您遇到的问题是.
匹配任何字符,而我们需要限制为非尖括号。
或许,您可以通过获取HtmlAgilityPack
作为第一个孩子的所有<a>
代码来利用<b>
,然后获得符合您条件的InnerText
:
var conditions = new[] { pFirstname, pLastname};
var seconds = new List<string>();
var webGet = new HtmlAgilityPack.HtmlWeb();
var doc = webGet.Load("http://www.birthday.no/sok/?f=Frank&l=Anderson");
var a_nodes = doc.DocumentNode.Descendants("a").Where(a => a.HasChildNodes && a.ChildNodes[0].Name == "b");
var res = a_nodes.Select(a => a.ChildNodes[0].InnerText).Where(b => conditions.All(condition => b.Contains(condition))).ToList();
foreach (var name in res)
{
var splts = name.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries);
if (splts.GetLength(0) > 2) // we have 3 elements at the least
seconds.Add(name.Trim().Substring(name.Trim().IndexOf(" ") + 1, name.Trim().LastIndexOf(" ") - name.Trim().IndexOf(" ") - 1));
}
这样,你只会获得第二个名字。我无法测试这段代码,但我认为你得到了要点。