javascript replace在str.replace(/%| \ $ \ s?|(,*)/ g,``)中匹配%,但在str.replace(/ \ $ \ s?|(,*)|%/ g中不匹配,'')

时间:2019-03-09 18:36:11

标签: javascript regex

我正在尝试将\$\s*,%匹配为一个字符串,例如 $ 3,222 100%

在chrome开发工具中,

如果我这样做了+str.replace(/%|\$\s?|(,*)/g, '')。我得到正确的结果number

但是如果我做+str.replace(/\$\s?|(,*)|%/g, ''),我会得到NaN

这种特殊行为的任何原因?

const str = "$ 32,333%"

console.log(+str.replace(/\$\s?|(,*)|%/g, ''))

console.log(+str.replace(/%|\$\s?|(,*)/g, ''))

3 个答案:

答案 0 :(得分:3)

/\$\s?|(,*)|%/g不能满足您的需求,因为,*在替代列表中用作非最终替代。由于替换期间JS正则表达式引擎如何处理空匹配而出现问题:

  • 100%中,用,*找到字符串的开始位置,并用空字符串替换,然后将正则表达式索引移到下一个字符之前的位置。由于%“胜出”,而正则表达式在那叫“一天”,因此未尝试使用,*替代方案
  • 接下来的步骤是相同的​​:0之前的空位置,下一个0%之前的空位置都与,*匹配,并且每次正则表达式都匹配索引继续前进。

改为使用,+。它将不再匹配空字符串。经验法则是:如果不确定自己要做什么,请不要在replace方法中使用空的匹配模式。

var str = "$ 32,333%"
console.log(+str.replace(/\$\s?|,+|%/g, ''))
console.log(+str.replace(/%|\$\s?|,+/g, ''))

答案 1 :(得分:1)

这并不能直接回答您的问题(@Wiktor的回答在此方面做得很好),但在我看来,您的目标是从字符串中取出所有数字并扔掉其余的数字。一个更简单的替代方法是使用否定字符类来匹配非数字的任何内容:

var str = "$ 32,333%";
var num = +str.replace(/[^0-9]/g,'');
console.log(num); // 32333

答案 2 :(得分:1)

const str = "$ 32,333%"
console.log(+str.replace(/\D/g, ''))

\ D:表示除数字以外的任何内容