【问题标题】:Regex to match repeating groups only capturing one group正则表达式匹配重复组只捕获一个组
【发布时间】:2015-08-04 21:55:40
【问题描述】:

我要匹配字符串

6 cakes 5 donuts 12 muffins

分为三组,即。 6 cakes5 donuts12 muffins。为了实现这一点,我使用了正则表达式

([\d]{1}[\s]{1}[\w]*) 

但问题是它只匹配第一组6 cakes 而忽略其余部分。如何更改它以使组重复。

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    您只需要使用Regex.Matches 获取MatchCollection 并获取匹配项。正则表达式可以是

    \d+\s+\w+
    

    regex demo

    在 C# 中,

    var str = "6 cakes 5 donuts 12 muffins";
    var rx = new Regex(@"\d+\s+\w+");
    var coll = rx.Matches(str);
    foreach (Match m in coll)
        Console.WriteLine(m.Value);
    

    IDEONE demo

    您也可以使用 LINQ:

    var str = "6 cakes 5 donuts 12 muffins";
    var rx = new Regex(@"\d+\s+\w+");
    var coll = rx.Matches(str).Cast<Match>().Select(p => p.Value).ToList();
    

    【讨论】:

    • 完美运行。唯一要注意的是,如果食物名称本身包含一些数字,那么模式就会中断。例如3 beers 5 chicken 65 9 cakes 会坏掉。
    • 您可以使用\d+(?:\s+\d+)*\s+\w+ 正则表达式。
    • 这只是稍稍被进球所遗漏。现在它匹配3 beers5 chicken65 9 cakes,而不是匹配3 beers5 chicken 659 cakes
    • 你怎么知道65属于chicken?背后的逻辑是什么?直到最后的所有数字后跟空格都属于上一个条目?
    • 我的意思是如果有多个连续数字,那么第一个数字属于前一组而不是后面的。
    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2014-01-30
    • 1970-01-01
    • 2020-04-09
    • 2017-09-13
    • 2011-03-11
    • 2017-01-07
    • 2019-12-19
    相关资源
    最近更新 更多