我该如何构造一个正则表达式来获得不确定数量的数学

本文关键字:不确定 正则表达式 一个 何构造 | 更新日期: 2023-09-27 18:20:48

作为桌面应用程序的一部分,我正试图从下载的Facebook数据包附带的HTML文件中的HTML列表中提取我的Facebook好友。这个列表就像

<h2>Friends</h2>
<ul>
   <li>John Skeet</li>
   <li>Donald Knuth</li>
   <li>Mark Zuckerberg</li>
   .
   .
   .
</ul>

(除了没有空格,没有换行符;我只是在这个线程中为了美观而这样写的)。所以我会尝试得到John SkeetDonald KnuthMark Zuckerberg。。。从中解脱出来。

注意:列表将是有限的。我一直在写的"…"并不意味着它会无限延续。

到目前为止,我的程序是

    private static readonly string _friendsRegex = "<h2>Friends</h2><ul>something</ul>"; // regular expression for matching friends' names
    static void Main ( string [] args )
    {
        try
        {   
            if ( args.Length != 1 ) throw new Exception("Unfriendly.exe expects 1 parameter, the full path the data of your Facebook acount");
            using ( StreamReader sr = new StreamReader("/html/friends") )
            {
                String html = sr.ReadToEnd();
                HashSet<string> curfriends = new HashSet<string>();
                Regex fregx = new Regex(String.Format(@"{0}",Program._friendsRegex), RegexOptions.Compiled);
                foreach (Match thisfriend in fregx.Matches(html))
                    curfriends.Add(thisfriend.Value);
                // ...
            }
        }

我想知道_friendsRegex应该是什么,或者是否有可能构建这样一个正则表达式。

我该如何构造一个正则表达式来获得不确定数量的数学

您只需使用

<li>([^<]+)<'/li>

并获取捕获组1的匹配项。参见演示

[^<]+匹配一个或多个不是< 的字符

您可以使用此Regex:<li>([a-zA-Z ]+)</li>

请记住,您需要获得第二个capture group,第一个是整个比赛。你可以这样得到:

foreach (Match match in fregx.Matches(html))
    curfriends.Add(match.Groups[1]);

此正则表达式只匹配使用普通字母和空格的名称,您可以根据需要在[]之间添加字符,也可以通过将[a-zA-z ]替换为[^<]来简单地使用除<之外的所有字符。