具有最大长度的小数的正则表达式

时间:2016-04-25 12:34:04

标签: c# regex

我不确定这是否可以使用正则表达式。我将尝试使用正则表达式,但如果不可能,我将切换到双重验证。

我的数据库(postgresql)接受decimal为15,6(最多15位,最多6位小数),所以如果我有10位整数,我可以有5位小数。小数分隔符被忽略。

我目前有这个正则表达式(逗号是小数点分隔符):

^\d{1,15}(\,\d{1,6})?$

它不会验证总长度,只验证左边的数字。 但由于用户也可以输入点数(千位分隔符),我有这个怪物:

^((\d+)|(\d{1,3}(\.\d{3})+)|(\d{1,3}(\.\d{3})(\,\d{3})+))((\,\d{4})|(\,\d{3})|(\,\d{2})|(\,\d{1})|(\,))?$

这个不接受超过3位小数。我可以编辑这个以接受6次decimais,但我仍然无法验证总长度。

是否可以验证号码的总长度?忽略点和逗号。

正则表达式应该接受:

1234567890,123456

1.234.567.890,123456

当然还有其他任何中间价值观:

1.234,121,01 ...

3 个答案:

答案 0 :(得分:3)

将此作为替代方案。在我看来,在这种情况下你不应该使用正则表达式。为什么?因为实际上匹配问题的正则表达式不容易理解。

该问题存在许多更简单的解决方案。以此为例:

var input = "1.234.567.890,123456";
var input2 = Regex.Replace(input, @"[^\d,]+", "");

var split = input2.Split(',');
var totalLength = split[0].Length + split[1].Length;

没什么特别的。但它的工作原理与目前提供的其他解决方案不同。

但是不同的文化背景呢?不同的文化使用不同的千分离器。这就像Double.TryParse这样的东西可以进来:

var input = "1.234.567.890,123456";

var style = NumberStyles.Number;
var culture = CultureInfo.CreateSpecificCulture("nl-NL");

double result;
if (double.TryParse(input, style, culture, out result))
{
    Console.WriteLine("It worked!");
}
else
{
    Console.WriteLine("Not valid");
}

以上是有效的,因为nl-NL文化使用了这种格式。将其设置为en-US,它将失败。

两者都没有真正使用正则表达式完成工作,但它们仍然可以产生所需的结果。

答案 1 :(得分:2)

我认为你需要

^(?:\d{1,3}(?:\.\d{3}){0,4}|\d{1,15})(?:,\d{1,6})?$

请参阅regex demo

整数部分仅允许1到15位数字(或5组3位数字块,用.数字分组符号分隔),并且可选地后跟逗号和1到6位十进制数字。

  • ^ - 字符串开头
  • (?:\d{1,3}(?:\.\d{3}){0,4}|\d{1,15}) - 2个替代方案:
    • \d{1,3}(?:\.\d{3}){0,4} - 1到3位数字,后跟0到4个点(\.)和3位数(\d{3}
    • 的序列
    • | - 或
    • \d{1,15} - 1到15位
  • (?:,\d{1,6})? - 逗号的可选序列(1或0次出现),后跟1到6位数
  • $ - 字符串结尾

答案 2 :(得分:0)

试试这个:^[\d\.\,]{1,15}([\.\,]\d{0,6})?$