使用正则表达式检索第二个名称

时间:2015-07-02 19:01:21

标签: c# regex

我想使用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;
}

我正在使用代码的当前结果是:
enter image description dd

1 个答案:

答案 0 :(得分:0)

您必须寻找类似

的内容
(?<=>[^<]*<b>)Frank([^<]+)Anderson</b></a></h3><p><span>([^<]+)

请参阅concise RegexStorm demo

在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));
}

这样,你只会获得第二个名字。我无法测试这段代码,但我认为你得到了要点。