我不确定这是否可以使用正则表达式。我将尝试使用正则表达式,但如果不可能,我将切换到双重验证。
我的数据库(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,12
,1,0
,1
...
答案 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})?$