用于最大长度货币的Javascript正则表达式
我想验证一个数字最大长度为13,小数点为2的货币字符串。我有一个逗号作为十进制分隔符,一个句点作为千位分隔符 我有一个正则表达式:用于最大长度货币的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
/^(\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})$
正则表达式详细信息:
:开始^
:向前看以匹配点或数字1到17次,后跟可选逗号和2位数字(?=[\d.]{1,17}(?:,\d{2})?$)
:匹配1到3位数字\d{1,3}
:匹配(?:\。\d{3})*
,后跟3位数字。重复此组0次或更多次
:匹配可选的(?:,\d{2})?
后跟两个十进制数字,
:结束$
^(?![\d.]{18})\d{1,3}(?:\.\d{3})*(?:,\d\d?)?$
请看一篇在线文章。这里假设您还允许使用一位小数
-开放式线锚^
-负向前看以防止前面出现18位/点(?![\d.]{18})
-一到三位数字\d{1,3}
-一个非捕获组,由一个文字点和三个数字组成,后面带有一个0+乘法器(?:\。\d{3})*
-可选的非捕获逗号组,后跟1或2位数字。删除问号,使第二个小数点成为非可选的(?:,\d\d?)
-端线锚$
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。不客气。欢迎接受答案这对你来说很管用,可以把线合上。