如何排除此正则表达式中的空白匹配项

How do i exclude the whitespace matches in this regex?

本文关键字:空白 正则表达式 何排除 排除      更新时间:2023-09-26

我有一个正则表达式,用于匹配特定问题的前导0

正则表达式将反对的文本通常是数学问题,看起来像:5 + 3

然而,这些都是生成的问题,有时它们与领先的0一起出现,例如:05 + 32

据我所知,解决这一问题的"正确"方法是修复传入的数据,但我们在另一方面也试图做的是,使获取这些表达式的消费代码更难出错,因此我们也希望消除领先的0

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

我有一个测试字符串,应该与之相对应:0000100001.23 + 009.00003 + 010005.00005

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

我知道它正是在做我所要求的事情——包括开头的任何非.或数字字符,或者没有前面的非0字符,在本例中包括空格。如何修改此正则表达式以明确表示不希望包含前面的空格?

需要注意的是,我不能使用负先行/后向,因为这将在JavaScript正则表达式引擎中工作,本质上是进入string.replace调用。

这可能不太理想,但由于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);

`

因为在javascript中工作,用户不能向后看,我可能建议找到所有的's[0]+并用空格替换,然后分别考虑您的边缘情况。在这种情况下,以0开头的字符串。所以像这样的东西

string.replace(/'s(?=0)0+/g, ' ').replace(/^[0]+/, '')

希望有太多的边缘情况,你不需要继续跟踪替换。

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

编辑:

利用您原来的regex,我们实际上可以采用同样的原理,并利用替换中的最后一个捕获变量

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

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

获得所需结果的另一个regexp模式:

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"