我的价格正则表达式有问题,我正在尝试更改。我希望它允许这样的数字:
- 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 位数字的可选模式$
-- 锚点在末端