C#中的正则表达式仅返回第一个匹配

3

我正在尝试使用以下正则表达式简单地拆分逗号分隔的字符串:

[^,]+

然而,我在C#中使用这个正则表达式得到的结果与其他引擎(如在线正则表达式编译器)不同。由于某种原因,C# 只能检测到字符串中的第一个元素。 样例逗号分隔字符串已在线编译。 以下是我在C#中使用的代码,它只返回:Foo
        var longString = "Foo, \nBar, \nBaz, \nQux"
        var match = Regex.Match(longString, @"[^,]+");
        var cutStrings = new List<string>();
        if (match.Success)
        {
            foreach (var capture in match.Captures)
            {
                cutStrings.Add(capture.ToString());
            }
        }

这对于“匹配”函数来说是非常正常的。Python也是这样做的,这通常更符合正则表达式的正式处理方式。我认为你的期望被“在线编译器”误导了。 - jpmc26
@jpmc26,您能否查看我在在线编译器中提供的示例,并指出错误的设置(如果有的话)?谢谢。 - Mehrad
我认为有些误解。我不是说你的设置是错误的。我的意思是在线编译器让你期望一些你不应该期望的东西。 - jpmc26
@jpmc26 在这种情况下,正如Sina所指出的那样,这只是一个简单的错误。然而,从你所说的来看,我的理解是在线编译器不一定会正确地运行,也许不能百分之百地信任它们。对吗? - Mehrad
1
它们并不是表现不当或不值得信赖。而是因为它们是图形化的,所以默认情况下会查找所有匹配项,因为在你盯着字符串时这更有用。另一方面,大多数编程语言会找到第一个匹配项并返回它,除非你调用一个专门设计用于查找所有匹配项的函数。他们这样做是因为由于你正在编写代码,你需要能够选择你想要的选项。重点是,不要期望代码库在默认情况下或在所有情况下与图形工具的行为相同。 - jpmc26
1个回答

11

Regex.Match 返回第一个匹配结果。尝试使用 Regex.Matches 来获取结果集合。


1
太棒了,从来不知道还有这样的方法。我一直使用 Regex.Match,然后引用我的命名组,例如 match.Group["x"].Captures。由于这个案例非常简单,我没有给我的组命名,结果现在我知道了。干杯! - Mehrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接