正则表达式:分组的基础知识

时间:2014-12-08 21:09:39

标签: c# .net regex

我使用以下正则表达式来匹配数字和测量单位:

\d+(?:\.|\,\d+)?[\s-]*(?:\d+)?(?:\/\d+)?(?:cm|mm|ml|cl|l|g|kg)

但是,当我匹配以下内容时:

22,3 cm

它在第一组比赛中给出了整个字符串。

如何将号码和单位分成两个不同的组?

var s1 = @"xxxx 22,3cm";
            var regex1 = new Regex(@"\d+(?:\.|\,\d+)?[\s-]*(?:\d+)?(?:\/\d+)?(?:cm|mm|ml|cl|l|g|kg)",RegexOptions.IgnoreCase); 
            var match1 = regex1.Match(s1);
            if (match1.Success)
            {
                Console.WriteLine(match1.Groups[0].Value); //prints 22,3cm but i need it to print 22,3 only
                Console.WriteLine(match1.Groups[1].Value); //this should print cm
            }

2 个答案:

答案 0 :(得分:1)

上面的这个表达式 ?: 会删除括号中与匹配组成员匹配的内容:

使用您的样本a,您想要的两个组是: (\d+(?:\.|\,\d+)?[\s-]*(?:\d+)?(?:\/\d+)?) (cm|mm|ml|cl|l|g|kg)

第二个没有?:

https://regex101.com/r/oD3wD2/1

答案 1 :(得分:1)

看起来你有四个非捕获组(?:)

听起来你想在某些()周围再增加两个捕获组:

(\d+(?:\.|\,\d+)?)[\s-]*((?:\d+)?(?:\/\d+)?(?:cm|mm|ml|cl|l|g|kg))

然后你可以分别使用$ 1和$ 2来获得数量和单位。

使用http://www.regexr.com/和其他工具进行故障排除和实验。

考虑是否有更好的库来解析带有单位的数字。编写自己的正则表达式是容易出错的,而且比你想象的还要多。