我写了以下正则表达式:/\D(?!.*\D)|^-?|\d+/g
我认为它应该这样工作:
\D(?!.*\D) # match the last non-digit
| # or
^-? # match the start of the string with optional literal '-' character
| # or
\d+ # match digits
但是,它没有:
var arrTest = '12,345,678.90'.match(/\D(?!.*\D)|^-?|\d+/g);
console.log(arrTest);
var test = arrTest.join('').replace(/[^\d-]/, '.');
console.log(test);
然而,当玩它时PCRE(php)
-flavour在线于Regex101。它的工作原理正如我所描述的那样。
我不知道我是否认为它应该以一种不起作用的方式起作用。或者如果 javascript 正则表达式风格中不允许某些模式。
JS 的工作方式与 PCRE 不同。关键是 JS 正则表达式引擎不能很好地处理零长度匹配,索引只是手动递增,并且跳过零长度匹配后的下一个字符。这^-?
可以匹配空字符串,并且它匹配12,345,678.90
开始,跳过1
.
如果我们看一下String#match文档,我们会看到每次调用match
使用全局正则表达式会增加正则表达式对象lastIndex
之后零长度找到匹配项:
- Else, global is true
A。使用参数调用 rx 的 [[Put]] 内部方法“最后索引" and 0.
b.设 A 为由表达式创建的新数组新数组() where Array是具有该名称的标准内置构造函数。
C。让上一个最后一个索引 be 0.
d.让n be 0.
e.让最后一场比赛 be true.
F。重复,同时最后一场比赛 is true
我。让result是调用 [[Call]] 内部方法的结果exec with rx as the this值和参数列表包含S.
二.如果result is null,然后设置最后一场比赛 to false.
三.别的,result is not null
1.让这个索引是调用 [[Get]] 内部方法的结果rx与论证“最后索引".
2.如果此索引 = 上一个最后索引 then
A。调用[[Put]]内部方法rx带参数“最后索引" and 这个索引+1.
b.放上一个最后一个索引 to 这个索引+1.
所以,匹配过程是从8a till 8f初始化辅助结构,然后进入 while 块(重复直到最后一场比赛 is true,一个内部exec命令匹配字符串开头的空格(8fi -> 8fiii),并且结果不是null, 这个索引被设置为最后索引上一次成功匹配的,并且由于匹配的长度为零(基本上,这个索引 = 上一个最后一个索引), the 上一个最后一个索引被设定为这个索引+1 - 在成功的零长度匹配后跳过当前位置.
您实际上可以在 a 中使用更简单的正则表达式replace
方法并使用回调来使用适当的替换:
var res = '-12,345,678.90'.replace(/(\D)(?!.*\D)|^-|\D/g, function($0,$1) {
return $1 ? "." : "";
});
console.log(res);
图案细节:
-
(\D)(?!.*\D)
- 一个非数字(捕获到第 1 组),后面没有除换行符和另一个非数字之外的 0 个以上字符
-
|
- or
-
^-
- 字符串开头的连字符
-
|
- or
-
\D
- 非数字
请注意,在这里您甚至不必将开头的连字符设为可选。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)