使用Javascript正则表达式用逗号解析数字

时间:2018-11-16 05:33:28

标签: javascript regex

我正在尝试解析1到10,000,000之间的数字,这些数字可以是连续数字(例如123456),也可以是在3位数字的组之间用逗号分隔(1,234,567)。逗号也可以是空格(1 234 567)或句点(1.234.567),但始终使用。 我写了以下内容:

<script type="text/javascript">  
  var re = /(\d{1,3})[ |\,|\.]?(\d{3})(?:[ |\,|\.]?(\d{3}))?/i;
  function testStr(input) {
    var str = input.value;
    var newstr = str.replace(re, '[1]: $1\n[2]: $2\n[3]: $3');
    alert(newstr);
 }  
 </script>  

这很好用,除了它还会解析输入,例如1234,567,890或1,​​234,5678 不允许使用4个连续数字组成的组。为什么会这样呢? 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

一个选项是

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

想法是捕获使用的分隔符(如果有的话-如果没有分隔符,则捕获空字符串)。然后,稍后,在需要分隔符的点上, backreference 与之前找到的分隔符相同,以确保所有分隔符都是相同的,无论它们是空格,逗号,句点还是一点都没有。另外,如果您需要解析 1 和10,000,000之间的数字,则应将所有超出起始(\d{1,3})之后的内容放入可选组。

请注意,字符集中的逗号和句点不需要转义,并且字符集中的|表示原义的竖线字符-只需使用[ ,.]

还使用^$锚来确保您从字符串的开头开始匹配并一直到字符串的结尾(否则将使匹配失败)。

https://regex101.com/r/2dFk0f/1

(\d{1,3})-一到三位数字,后跟一个可选的大非捕获组

([ ,.]?)(\d{3})(?:\2(\d{3}))?,即:

([ ,.]?)-捕获使用的分隔符

(\d{3})-重复三位数

(?:\2(\d{3})?-如果数字为1m或更大,则应使用分隔符,因此请回引用之前捕获的分隔符,然后再附加三个数字。 (如果数字小于1m,则此可选组将不匹配)