Javascript 匹配5个(精确)逗号分隔货币值的正则表达式

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

我需要匹配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,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
    标志,则为行)