Javascript 匹配5个(精确)逗号分隔货币值的正则表达式
我需要匹配5个逗号分隔的货币值 我确实有一个reg-ex做这项工作,但我认为这不是一个好的方式Javascript 匹配5个(精确)逗号分隔货币值的正则表达式,javascript,regex,Javascript,Regex,我需要匹配5个逗号分隔的货币值 我确实有一个reg-ex做这项工作,但我认为这不是一个好的方式 ^(\$[0-9]{1,3}(?:[,.]?[0-9]{3})*(?:\.[0-9]{2})?,\s?){4}(\$[0-9]{1,3}(?:[,.]?[0-9]{3})*(?:\.[0-9]{2})?)$ 另外,我必须将表达式拆分为匹配的、4个逗号分隔的匹配项和1个以嗅出尾随逗号的匹配项(我认为这不是解决问题的方法) 一些有效的匹配输入可能是 $200,000,$525,$60000,$120,0
^(\$[0-9]{1,3}(?:[,.]?[0-9]{3})*(?:\.[0-9]{2})?,\s?){4}(\$[0-9]{1,3}(?:[,.]?[0-9]{3})*(?:\.[0-9]{2})?)$
另外,我必须将表达式拆分为匹配的、4个逗号分隔的匹配项和1个以嗅出尾随逗号的匹配项(我认为这不是解决问题的方法)
一些有效的匹配输入可能是
$200,000,$525,$60000,$120,000,$65,456 (space between currency values is optional)
$200,000, $525, $60000,$120,000, $65,456
一些无效的输入值
$200,000,$525,$60000,$120,000,$65,456, (Trailing comma)
$200,000,,$525,$60000.$120,000,$65,456,, etc
任何指点都将不胜感激
编辑:我正在寻找的解决方案是一个纯reg ex解决方案(比我上面写的更好),因此,我可以在用户输入错误输入时立即启动验证。是您试图实现的一个更简单的版本:
^(?:\$\d{1,3}(?:,?\d{3})*[,.] ?){4}\$\d{1,3}(?:,?\d{3})*$
-------------------------------
- 下划线部分与您定义的4个“价格”匹配,后跟点/逗号和可选空格
- 其余部分与最后一个“价格”匹配
^(?:\$\d{1,3}(?:,?\d{3})*[,.] ?){4}\$\d{1,3}(?:,?\d{3})*$
-------------------------------
- 下划线部分与您定义的4个“价格”匹配,后跟点/逗号和可选空格
- 其余部分与最后一个“价格”匹配
请告诉我是否有不清楚的地方模式所基于的最常用字符是
\$
(转义),无论它是字符串的第一个字符还是前面有逗号(可选后跟空格),都是使用(?:^ |,)\s*
完成的。在此之后,您需要任意数量的数字,即\d+
,可以选择后跟一个逗号,该逗号后面紧跟着数字<代码>,\d+
结合这些,你会得到<代码>/(?:^ |,)\s*(\$\d+(?:,\d+))/g
const pattern=/(?:^ |,| \.)\s*(\$\d+(?:,\d+))/g;
常数测试=[
'$200,000,$525,$60000,$120,000,$65,456',
'$200,000, $525, $60000,$120,000, $65,456',
'$200,000,$525,$60000,$120,000,$65,456,',
'$200,000,,$525,$60000.$120,000,$65,456,,',
];
常量匹配=test.reduce((进位,字符串)=>{
让match=null;
while(match=pattern.exec(string)){
推进(匹配[1]);
}
返运;
}, []);
console.log(匹配项)代码>模式所基于的最常用字符是\$
(转义),无论它是字符串的第一个字符还是前面有逗号(可选后跟空格),都是使用(?:^ |,)\s*
完成的。在此之后,您需要任意数量的数字,即\d+
,可以选择后跟一个逗号,该逗号后面紧跟着数字<代码>,\d+
结合这些,你会得到<代码>/(?:^ |,)\s*(\$\d+(?:,\d+))/g
const pattern=/(?:^ |,| \.)\s*(\$\d+(?:,\d+))/g;
常数测试=[
'$200,000,$525,$60000,$120,000,$65,456',
'$200,000, $525, $60000,$120,000, $65,456',
'$200,000,$525,$60000,$120,000,$65,456,',
'$200,000,,$525,$60000.$120,000,$65,456,,',
];
常量匹配=test.reduce((进位,字符串)=>{
让match=null;
while(match=pattern.exec(string)){
推进(匹配[1]);
}
返运;
}, []);
console.log(匹配项)代码>更新
如果要在验证价格时进行匹配,可以执行以下操作:
- 包括用于格式化价格的点和逗号
- 价格之间最多有一个空格字符
细分:
^
匹配输入字符串的开头(如果设置了m
标志,则匹配行)
\$\d+
匹配前面有多个数字的$
(
分组的开始(#1
)
[,.]\d{3}
匹配前面3位的句点或逗号
)*
分组结束(#1
),至少匹配零次
(
分组的开始(#2
)
?,?
匹配由可选空格包围的逗号(两边各有一个空格)
\$\d+
匹配前面有多个数字的$
([,.]\d{3})*
匹配一个句点或逗号,该句点或逗号前有3位数字(千位分隔符),匹配时间至少为零
){4}
分组结束(#2
),重复4次
$
输入字符串的结尾(如果设置了m
标志,则为行)
JS代码:
var re=/^\$\d+([,.]\d{3})*((?,?\$\d+([,.]\d{3})*){4}$/g;
风险价值价格=['$200000、$525、$60000、$120000、$65456',
'$200,000, $525, $60000,$120,000, $65,456',
'$200,000,$525,$60000,$120,000,$65,456, ',
'$200,000,,$525,$60000.$120,000,$65,456,,'];
价格。forEach(函数){
console.log(s+“=>”+布尔值(s.match(re)))
})
更新
如果要在验证价格时进行匹配,可以执行以下操作:
- 包括用于格式化价格的点和逗号
- 价格之间最多有一个空格字符
细分:
^
匹配输入字符串的开头(如果设置了m
标志,则匹配行)
\$\d+
匹配前面有多个数字的$
(
分组的开始(#1
)
[,.]\d{3}
匹配前面3位的句点或逗号
)*
分组结束(#1
),至少匹配零次
(
分组的开始(#2
)
?,?
匹配由可选空格包围的逗号(两边各有一个空格)
\$\d+
匹配前面有多个数字的$
([,.]\d{3})*
匹配一个句点或逗号,该句点或逗号前有3位数字(千位分隔符),匹配时间至少为零
){4}
分组结束(#2
),重复4次
$
输入字符串的结尾(如果设置了m
标志,则为行)