Strip all non-numeric characters from string in JavaScript
考虑使用javascript/ecmascript从字符串中删除所有非数字字符的非dom方案。应保留在0 - 9范围内的任何字符。
1 2 3
| var myString = 'abc123.8<blah>';
//desired output is 1238 |
如何在纯JavaScript中实现这一点?请记住,这是一个非DOM场景,因此jquery和其他涉及浏览器和按键事件的解决方案不适用。
使用字符串的.replace方法和\D的regex,后者是一个与所有非数字匹配的速记字符类:
1
| myString = myString.replace(/\D/g,''); |
- 谢谢CSJ,有什么地方可以找到更多关于\D的信息吗?
- 这是我的默认regex引用:regular-expressions.info/reference.html内置字符类每个都有内置的补充。 d d(数字对除数字以外的所有内容的对比)w w(单词字符对除单词字符以外的所有内容的对比)s s(空白对除空白以外的所有内容的对比)
- 为了清楚起见,这里是replace的语法:w3schools.com/jsref/jsref_obj_regexp.asp,因为正斜杠和"g"是该命令的一部分,而不是regex的一部分。
- replace在所有浏览器中都能使用这种精确的语法吗?似乎我记得在旧版本的IE中,当我使用jquery获取的文本时,我得到了一个object has no method 'replace' 。或者类似的。
- @我不知道过去或现在的浏览器支持什么。该问题指定了非DOM上下文,因此海报很可能是在非Web浏览器环境中编写脚本的。
- 在线测试正则表达式的好工具(它不是我的)。ReGeX101.com
- 我尝试了跟踪,但没有任何效果"this.value=this.value.replace(eval(!/^[a-za-zd.-,]$/),""""this.value=this.value.replace(eval(/^[a-za-zd.-,]$/),""")this.value=this.value.replace(eval(specialcharregex),""")我该怎么办?
如果你需要这个留下浮点数的点,用这个
4
- 有Regexp专家吗?如何使它只允许一个点(与数字非常相关)。谢谢!
- 你什么意思?给出输入输出示例
- 我的意思是,它目前接受例如"1..56"和"1.5.28",对吗?是否可以使它只接受单点数字,如"1.56"?
- 使用stackoverflow.com/a/16951568/579646这样测试它:new regexp(/^-?D+.? d*$/).试验("1.5.28")
- 你的regex中有没有可能用.改变所有,?在某些国家,逗号用作分隔符而不是点。:)
- @这是错误的,但要注意,在这种情况下,它们可能都在那里(例如1000000.5),所以你应该这样做。首先替换(/",,"../g)。
- @max4在regexp中"-是什么?
- 不好:"aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')→2.9.应该去掉任何可能环绕数字的字符串。
- 伟大的考验!我的第一个想法是[^d.-]+[^d]+在这种情况下应该有效
- @max4你救了我一命,感谢你处理了-号(负数)案件:)
- @可能是卡斯佩里:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))。
- 很好的答案,如果您想要一个数字字段,您的意思是任何数字事件浮动:)
如果脚本实现支持正则表达式,请使用它。类似:
1
| myString.replace(/[^0-9]/g, ''); |
- 出于某种原因,这种方式似乎比[^d]更可读。
- 正则表达式分隔符后面的g代表什么??
- 不适合浮点数:/
- @nativecoder stackoverflow.com/questions/12993629/&hellip;
可以使用regexp替换所有非数字字符:
1 2
| var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238 |
沿着这条线的东西:
1
| yourString = yourString.replace ( /[^0-9]/g, '' ); |
- 不完全是对原始问题的回答,而是处理小数点的版本:yourString = yourString.replace ( /[^0-9.]/g, '' );。
尝试
1
| myString.match(/\d/g).join('') |
1 2
| var myString = 'abc123.8<blah>'
console.log( myString.match(/\d/g).join('') ); |
我们在2017年,您也可以使用ES2016
1 2
| var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join('')); |
或
1
| console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join('')); |
结果是
- 这是一个非常低效的方式来进行这个操作。
- 这当然是一种选择,只是不是一个很好的选择。
- 什么是低效的或坏的?
- 它通过一个备用方法将字符串转换成一个单字符串数组,然后在每个数组项上的javascript上应用过滤函数,返回一个新的字符串数组,最后将该数组重新连接到一个字符串中。regex接受一个字符串并返回一个字符串,处理通过本机代码完成。