我使用以下正则表达式来匹配数字和测量单位:
\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
}
答案 0 :(得分:1)
上面的这个表达式 ?:
会删除括号中与匹配组成员匹配的内容:
使用您的样本a,您想要的两个组是:
(\d+(?:\.|\,\d+)?[\s-]*(?:\d+)?(?:\/\d+)?)
和 (cm|mm|ml|cl|l|g|kg)
第二个没有?:
答案 1 :(得分:1)
看起来你有四个非捕获组(?:)
。
听起来你想在某些()
周围再增加两个捕获组:
(\d+(?:\.|\,\d+)?)[\s-]*((?:\d+)?(?:\/\d+)?(?:cm|mm|ml|cl|l|g|kg))
然后你可以分别使用$ 1和$ 2来获得数量和单位。
使用http://www.regexr.com/和其他工具进行故障排除和实验。
考虑是否有更好的库来解析带有单位的数字。编写自己的正则表达式是容易出错的,而且比你想象的还要多。