【发布时间】:2016-12-16 01:48:12
【问题描述】:
我写了以下正则表达式:/\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 regex-flavour 中不允许使用某些模式。
【问题讨论】:
-
您的预期结果是什么?
-
@anubhava。我希望它返回
12345678.90 -
我认为您可以使用
var res = '-12,345,678.90'.replace(/(\D)(?!.*\D)|^-?|\D/g, function($0,$1) { return $1 ? "." : ""; });- 单个替换操作。 -
@WiktorStribiżew。伙计,这很聪明,您只需要一种替换方法就可以完成所有工作
-
JS 的工作方式与 PCRE 不同。关键是 JS 正则表达式引擎并不能很好地处理零长度匹配,索引只是手动递增,并跳过零长度匹配后的下一个字符。
标签: javascript regex