用于最大长度货币的Javascript正则表达式

用于最大长度货币的Javascript正则表达式,javascript,regex,currency,Javascript,Regex,Currency,我想验证一个数字最大长度为13,小数点为2的货币字符串。我有一个逗号作为十进制分隔符,一个句点作为千位分隔符 我有一个正则表达式: /^(\d{1}\.)?(\d+\.?)+(,\d{2})?$/ For sintax有效,但不适用于最大长度。我需要在这个正则表达式中添加什么 例如,这些字符串必须有效: 1.000.000.000.000 1.000.000.000.000,00 1 1,00 123,45 这些必须是无效的: 10.000.000.000.000 10.000.000.00

我想验证一个数字最大长度为13,小数点为2的货币字符串。我有一个逗号作为十进制分隔符,一个句点作为千位分隔符

我有一个正则表达式:

/^(\d{1}\.)?(\d+\.?)+(,\d{2})?$/
For sintax有效,但不适用于最大长度。我需要在这个正则表达式中添加什么

例如,这些字符串必须有效:

1.000.000.000.000
1.000.000.000.000,00
1
1,00
123,45
这些必须是无效的:

10.000.000.000.000
10.000.000.000.000,00
10.000.000.000.000.000
10.000.000.000.000.000,00

您可以使用此正则表达式进行验证:

^(?=[\d.]{1,17}(?:,\d{2})$)\d{1,3}(?:\。\d{3})*(?:,\d{2})$

正则表达式详细信息:

  • ^
    :开始
  • (?=[\d.]{1,17}(?:,\d{2})?$)
    :向前看以匹配点或数字1到17次,后跟可选逗号和2位数字
  • \d{1,3}
    :匹配1到3位数字
  • (?:\。\d{3})*
    :匹配
    ,后跟3位数字。重复此组0次或更多次
  • (?:,\d{2})?
    :匹配可选的
    后跟两个十进制数字
  • $
    :结束

可能尝试使用负前瞻性断言位置后面没有18位/点:

^(?![\d.]{18})\d{1,3}(?:\.\d{3})*(?:,\d\d?)?$
请看一篇在线文章。这里假设您还允许使用一位小数

  • ^
    -开放式线锚
  • (?![\d.]{18})
    -负向前看以防止前面出现18位/点
  • \d{1,3}
    -一到三位数字
  • (?:\。\d{3})*
    -一个非捕获组,由一个文字点和三个数字组成,后面带有一个0+乘法器
  • (?:,\d\d?)
    -可选的非捕获逗号组,后跟1或2位数字。删除问号,使第二个小数点成为非可选的
  • $
    -端线锚

90%的情况下,有比使用正则表达式更好的解决方案。最好是将字符串转换成实数,然后与限制进行比较(即
99999999999

//传递一个字符串
函数convertStr(字符串){
/*
删除所有“.”
将所有“,”替换为“.”
*/
让numStr=string.split('.').join('.).replaceAll('.','.');
//将修改后的字符串转换为实数
让realNum=parseFloat(numStr);
/*
如果转换的字符串是实数。。。
将其四舍五入到小数点后两位并返回
否则返回false
*/
return!Number.isNaN(realNum)?Math.round((realNum+Number.EPSILON)*100)/100:false;
}
//传递一个字符串和最大值
函数numLimit(字符串、限制){
//获取convertString()的结果
设number=convertStr(字符串);
//如果结果等于或小于极限。。。
if(数字numLimit(str,limit));
让invalidResults=invalid.map(str=>numLimit(str,limit));
log('valid:'+validResults);

console.log('invalid:'+invalidResults);
如果您需要确保字符串中的数字应该少于16位,请在
之后添加
(?!(?:\D*\D){16})
。感谢@WiktorStribiżew的回答,这是有效的,但比其他答案复杂一点。我不认为
(?=[\D.]{1,17}(?,\D{2})$)
是正确的与
(?!(?:\D*\D){16}
相比,“不太复杂”,但可以随意使用最适合您的解决方案。
(?!(?:\D*\D){16})
语法可以忽略任何非数字的计数。
(?![\D.]{18})
遵循类似的逻辑(尽管它必须依赖后续的消费模式才能正常工作),但更具体,因为它只将点匹配为非数字。抱歉,我不是regex的专家,我无法在regex101或类似页面中尝试您的解决方案。但我理解您的解决方案,无法尝试这是一个小问题。非常感谢您的时间。致意。感谢anubhava的回答,这是我需要的。致意。感谢zer00ne f或者为regex设计一个替代解决方案,看起来不错,但是,如果regex在一行中工作很好,为什么要使用这个解决方案呢?请注意。当输入参数稍有不同时,尝试调整这一行。我可以简化它,但像您这样的新手不会这么容易理解。@Corporativo。不客气。欢迎接受答案这对你来说很管用,可以把线合上。