正则表达式匹配重复组,仅捕获一个组

3

我想要匹配这个字符串

6 cakes 5 donuts 12 muffins

将文本分成三组,即6个蛋糕5个甜甜圈12个松饼。为了实现这一点,我使用了正则表达式


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

但问题是它只匹配了第一组“6 cakes”,而忽略了其余的。我该如何修改以使该组重复出现?
1个回答

2

您只需要使用Regex.Matches获取一个MatchCollection,然后获取匹配项。正则表达式可以是:

\d+\s+\w+

请查看正则表达式演示

在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演示

您也可以使用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();

enter image description here


这只是稍微差了一点点。现在它匹配的是“3瓶啤酒”,“5只鸡”和“65个9寸蛋糕”,而应该匹配的是“3瓶啤酒”,“5只鸡65”和“9个蛋糕”。 - Soham Dasgupta
我的意思是,如果有多个连续数字,则第一个数字属于前一组而不是后一组。 - Soham Dasgupta
这个正则表达式\d+(?:\s+\d+)*\s+\w+(?:\s+\d+)*(?=\s+\d+|$)非常好用。非常感谢。 - Soham Dasgupta
请检查这个:\d+(?:\s+\d+)*\s+\w+(?:\s+\d+(?=\s+\d+))? - Wiktor Stribiżew
非常好,请考虑接受答案,如果对您有帮助,请点赞。 - Wiktor Stribiżew
显示剩余3条评论

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