只匹配数字、逗号和点,忽略空白

Only match numbers, commas and dots and ignore whitespaces

本文关键字:空白 数字      更新时间:2023-09-26

我有一个价格表,我想"规范化",使用Javascript风格的Regex。

样本输入:

1
1,99
1.99
10
100
5999 dollars
2 USD
$2,99
Our price 2.99
Price: $ 20
200 $
20,-
6 999 USD
所需输出:

1
1,99
1.99
10
100
5999
2
2,99
2.99
20
200
20
6999

我得到了相当好的结果与/([0-9.,'s]+)/,但我有两个问题:

  • 最后一行返回6而不是6 999。我不确定是否有可能"删除"空间,最好是我想获得6999,但6 999足够接近。

  • 最后第二行返回20,(这是合乎逻辑的,因为我包括逗号),但更希望20只在这些情况下。

这里有一个小提琴:http://jsfiddle.net/8h8Tk/

如果你真的想规范化你的输入,我建议你选择或者。用于十进制值分隔符。但是,如果不是,上面的jsfiddle会给出正确的输出。

var output = input.replace(/[^0-9'.,'n]|,[^0-9]/g, "");

这是一个直接从匹配(或替换)模式中跳出来的版本,除了s1, s2, s3等情况

正则表达式:(?:'d|[.,](?='d))+|('w+|.)

左侧匹配我们想要的字符:数字,或者点和逗号后面跟着数字。右边匹配并捕获单词字符或单个字符,我们知道这些不是我们想要的字符,因为它们没有被左边的表达式匹配。

当设置了Group 1时,用空字符串替换。

查看在线演示

的输出
<script>
var subject = "1 'n'
1,99 'n'
1.99 'n'
10 'n'
100 'n'
5 999 'n'
2 USD 'n'
$2,99 'n'
Our price 2.99 'n'
Price: $ 20 'n'
200 $ 'n'
20,- 'n'
6 999 USD";
var regex = /(?:'d|[.,](?='d))+|('w+|.)/g;
replaced = subject.replace(regex, function(m, group1) {
    if (group1 == "" ) return m;
    else return "";
});
document.write("<pre>");
document.write(replaced);
document.write("</pre>");
</script>

1
1,99
1.99
10
100
5999
2
2,99
2.99
20
200
20
6999

如果您不介意分两步完成,请首先将所有逗号转换为点:

x = x.replace(/,/g, '.')

然后删除其他所有内容:

x = x.replace(/[^.|0-9]+/g,'')

替换不需要的部分:

result = subject.replace(/[^'d.,]+/g, "");

/((?:['d.,'s]+)?['d]+)'b/g呢?它从你的原始版本扩展而来