正则表达式表示带或不带空格的十进制价格



我的价格正则表达式有问题,我正在尝试更改。我希望它允许这样的数字:

  • 11111,64
  • 2 122,00
  • 123,12
  • 123 345,23

现在我有这样的东西,但它不接受没有空格的数字。

'^d{1,3}( d{3}){0,10}[,]*[.]*([0-9]{0,2'})?$'

我尝试将( d{3})更改为(s{0,1}d{3})但它仍然不起作用:(

如果你把它们分成几块,所有的问题都会更容易。

首先,我们必须匹配非十进制
1
100
1 000
10 000 000

  • 第一组是 1 到 3 位数字或d{1,3}
  • 我们仍然需要考虑以下可能存在也可能不存在的群体。在正则表达式中是一个*或 0 或许多d{1,3}(sd{3})*在第二部分中,我们在集合前面放了一个空格,现在它现在寻找 3 组之间的空格。
  • 为了完成这个集合,我们为一个平面数字块添加一个d+
  • 最后,我们必须匹配小数,可选?.^(d{1,3}(sd{3})*|d+)(,d+)?$
/^(d{1,3}(sd{3})*|d+)(,d+)?$/.test(str)

在这里再测试一下:https://regex101.com/r/NKAVLk/1

[
'1',
'123',
'11111,64',
'2 122,00',
'123,12',
'123 345,23',
'2 12,00',    // no match, pair of 2 digits
'2 1234,00',  // no match, pair of 4 digits
'1,123'       // no match, > 2 digits after comma
].forEach(str => {
let t = /^(:?d{1,3}( d{3})*|d+)(,d{0,2})?$/.test(str);
console.log(str + ' => ' + t);
});

输出:

1 => true
123 => true
11111,64 => true
2 122,00 => true
123,12 => true
123 345,23 => true
2 12,00 => false
2 1234,00 => false
1,123 => false

正则表达式的解释:

  • ^-- 启动时锚定
  • (:?-- 非捕获组启动(对于逻辑 OR)
    • d{1,3}-- 预计 1 到 3 位数字
    • ( d{3})*-- 期望 0+ 空格模式和 3 位数字
  • |-- 逻辑或
    • d+-- 期望 1+ 位数字
  • )-- 非捕获组结束
  • (,d{0,2})?-- 逗号和 0 到 2 位数字的可选模式
  • $-- 锚点在末端