为啥 Regex.Match 只返回 1 个结果?

Posted

技术标签:

【中文标题】为啥 Regex.Match 只返回 1 个结果?【英文标题】:Why does Regex.Match return only 1 result?为什么 Regex.Match 只返回 1 个结果? 【发布时间】:2010-09-23 13:01:47 【问题描述】:

我正在使用 strips the href tags out of an html doc 保存到字符串的正则表达式。以下代码是我在 C# 控制台应用程序中使用它的方式。

Match m = Regex.Match(htmlSourceString, "href=[\\\"\\\'](http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?[\\\"\\\']");

        if (m.Success)
        
            Console.WriteLine("values = " + m);
        

但是,它只返回一个结果,而不是 html 页面上所有 href 标记的列表。我知道它有效,因为当我尝试RegexOptions.RightToLeft 时,它会返回字符串中的最后一个 href 标记。

我的 if 语句是否有什么东西不允许我返回所有结果?

【问题讨论】:

【参考方案1】:

Match 方法搜索字符串的第一次出现,Matches 方法搜索所有出现。

【讨论】:

只是想知道,我必须将 Match m 更改为 MatchCollections m 才能使用 Regex.Matches() 方法,但随后它说 MatchCollections 没有 m.success 的定义。有什么我想念的吗? @Matt S - 如果有匹配,它的长度 > 0 哇哇哇哇哇哇【参考方案2】:

如果您使用 Match 而不是 Matches,您需要使用循环来获取所有匹配,在每个循环结束时调用 m.NextMatch()。例如:

    Match m = Regex.Match(htmlSourceString, "href=[\\\"\\\'](http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?[\\\"\\\']");
    Console.Write("values = ");
    while (m.Success) 
     
        Console.Write(m.Value);
        Console.Write(", "); // Delimiter
        m = m.NextMatch();
    
    Console.WriteLine();

【讨论】:

非常感谢,马丁!这是我最终使用的方法。

以上是关于为啥 Regex.Match 只返回 1 个结果?的主要内容,如果未能解决你的问题,请参考以下文章

与 C# 控制台应用程序中的相同代码相比,Regex.Match 在 Unity 中返回不同/错误的结果

php regex preg_match 只允许某些关键字

C# (.net) RegEx.Match 换行符之间的子字符串 - 使用换行符作为正向超前限制

为啥不使用存储库返回部分域模型结果 [关闭]

为啥我在循环中的 Mongoose 查询只返回第一个结果?

为啥只传递 1 个参数时 argc 返回 2? [复制]