【问题标题】:How do I construct a regular expression to get an undetermined number of mathches like如何构造正则表达式以获得不确定数量的匹配项,例如
【发布时间】:2015-11-06 15:24:46
【问题描述】:

作为桌面应用程序的一部分,我试图从一个 HTML 列表中提取我的 Facebook 朋友,该列表位于下载的 Facebook 数据包随附的 HTML 文件中。列表是这样的

<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 应该是什么,或者是否有可能构建这样的正则表达式。

【问题讨论】:

  • [\w]+
  • ”呢? \w 后面的空格是有意的;)
  • w 上获取“意外的转义序列”错误
  • 标签: c# html .net regex


    【解决方案1】:

    你可以使用

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

    并抓取捕获组 1 的匹配项。See demo

    [^&lt;]+ 匹配一个或多个不是&lt;的字符

    【讨论】:

    • 那个 \g 有什么作用?
    • @AbolishtheIRS 在某些语言中用于全局匹配(返回所有匹配项),其他语言对此有自己的功能。 Idk 如果这存在于 .NET 正则表达式中,see here
    【解决方案2】:

    你可以使用这个正则表达式:&lt;li&gt;([a-zA-Z ]+)&lt;/li&gt;

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

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

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

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签