[英]How do i exclude the whitespace matches in this regex?
我有一个正则表达式,我用它来匹配我遇到的特定问题的前导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 并用空格替换。 然后处理没有空格的前导零的边缘情况(在这种情况下,只是字符串的开头)
编辑:
利用您的原始正则表达式,我们实际上可以采用相同的原则并利用替换中的最后一个捕获变量
string.replace(/([^\.\d]|^)[0]+/g, '$1')
在这里它将用空格或起始字符(当强制为字符串时为空)替换零(未捕获)
获得所需结果的另一种正则表达式模式:
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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.