如何排除此正则表达式中的空格匹配?

时间:2016-05-10 20:13:10

标签: javascript regex

我有一个正则表达式,我用它来匹配前导0以解决我遇到的特定问题。

正则表达式将反对的文本通常是数学问题,如下所示:5 + 3

然而,这些是产生的问题,有时它们带有前导0,例如:05 + 32

'正确'解决这个问题的方法我知道的是修复进来的数据但是我们在另一方面试图做的事情是让更难以从获取这些表达式的消费代码中搞砸所以我们和#39; d也想消除那里的领先0

正则表达式如下:/([^\.\d]|^)[0]+/g

我有一个测试字符串,这应该反对:0000100001.23 + 009.00003 + 010005.00005

这个正则表达式有效,除了包括第二个和第三个数字之间的空格及其各自的+符号,如下所示:http://regexr.com/3dd2t

我理解它正在做我正在问的问题 - 包括开头的任何非.或数字字符,或者没有前面的非0字符,这种情况包括空格。如何修改此正则表达式以表明我不想包含前面的空格?

作为一个注释,我不能使用负向前瞻/后瞻,因为这将在JavaScript正则表达式引擎中工作,基本上进入string.replace调用。

3 个答案:

答案 0 :(得分:1)

这可能不太理想,但由于String.prototype.replace可以将函数作为第二个参数,因此您可以使用嵌套的replace调用:第一个将获得整数(包括前导0)和第二个将关闭0。

var problem = "0000100001.23 + 009.00003 + 010005.00005";

var fixed = problem.replace(/[\.\d]+/g, function (item) {
    return item.replace(/^0+/, '');
});

// or, shorter version:

var fixed2 = problem.replace(/[\.\d]+/g, item => item.replace(/^0+/, ''));

// Just for snippet output:
document.write(fixed);
document.write('<br />');
document.write(fixed2);

`

答案 1 :(得分:1)

因为正在使用javascript并且用户无法查看,我可能会建议找到所有\s[0]+并替换为空格,然后分别考虑您的边缘情况。在这种情况下,字符串以前导0开头。像

这样的东西
string.replace(/\s(?=0)0+/g, ' ').replace(/^[0]+/, '')

希望有更多的边缘案例,你不需要继续修改替换。

所以我们正在做的是,而不是仅仅使用前导空格查找0,我们捕获空间+ 0并用空格替换。然后处理没有空格的边缘情况前导零(在这种情况下,只是字符串的开头')

修改

利用原始正则表达式,我们实际上可以采用相同的原则并利用替换中的最后一个捕获变量

string.replace(/([^\.\d]|^)[0]+/g, '$1')

这里它将用空格或开始的char(在强制转换为字符串时为空)替换零(未捕获)#

答案 2 :(得分:0)

获得所需结果的另一种正则表达式模式:

var str = "0000100001.23 + 009.00003 + 010005.00005 +002.0102 + 0809.0009";

console.log(str.replace(/(^[0]+([0-9.]+\b)|(\s)[0]+)/g, "$3$2"));
// "100001.23 + 9.00003 + 10005.00005 +002.0102 + 809.0009"