为啥 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 中返回不同/错误的结果