我正在尝试将\$\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, ''))
答案 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:表示除数字以外的任何内容