JavaScript中从字符串中剔除所有非数字字符。

980

考虑一种非DOM场景,您希望使用JavaScript/ECMAScript从字符串中删除所有非数字字符。保留在0-9范围内的任何字符。

var myString = 'abc123.8<blah>';

//desired output is 1238

你要如何在普通的JavaScript中实现这个功能?请记住这是一个非DOM场景,所以jQuery和其他涉及浏览器和按键事件的解决方案都不适用。

12个回答

1957
使用字符串的 .replace 方法和正则表达式 \D,这是一个快捷字符类,匹配所有非数字字符。
myString = myString.replace(/\D/g,'');

10
谢谢您的提问,\D 的更多信息可以在哪里找到? - p.campbell
43
这是我的默认正则表达式参考网址:http://www.regular-expressions.info/reference.html内置字符类别都有对应的反义字符类别。 \d \D(数字和非数字) \w \W(单词字符和非单词字符) \s \S(空白字符和非空白字符) - csj
2
replace在所有浏览器中都支持这个确切的语法吗?好像我记得在旧版本的IE中,当我使用jQuery获取文本并使用它时,会出现“对象没有方法'replace'”的错误...或者类似的情况。 - cwd
2
@cwd 我不知道过去或现在的浏览器支持了什么。问题指定了一个非 DOM 上下文,因此很可能发帖者是在非 Web 浏览器环境中编写脚本。 - csj
显示剩余7条评论

476

如果您需要保留小数点以便处理浮点数,请使用以下方法

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"

12
有正则表达式专家吗?如何使其只允许一个点(在处理数字时非常相关)?谢谢! - Kasperi
1
@max4ever 正则表达式中的 "-" 是什么意思? - jave.web
3
不好的代码:"aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.应剥离可能包含数字的任何字符串。 - vsync
3
@max4ever你救了我的命,感谢你处理负数情况 :) - Pankaj Parkar
6
parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, '')) 可能是这样的代码。 - A. Genedy
显示剩余8条评论

81

如果您的脚本支持正则表达式,则可以使用正则表达式,例如:

myString.replace(/[^0-9]/g, '');

25
出于某种原因,这种方式似乎比 [^\d] 更易读。 - Arman Bimatov
1
正则表达式分隔符后面的"g"是什么意思? - Native Coder
3
"G"标志在正则表达式中表示全局匹配。当使用此标志时,正则表达式将尝试找到所有可能的匹配项,而不仅仅是第一个匹配项。 - RagnaRock
1
不适用于浮点数/十进制数值,例如“7.6美元”将返回76。 - Sikandar Tariq
1
就像 @SikandarTariq 提到的那样,但也包括负值。 - skilleo

37
您可以使用正则表达式来替换所有非数字字符:
var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238

32

类似于以下内容:

yourString = yourString.replace ( /[^0-9]/g, '' );

18
这不完全是对原问题的回答,而是一个处理小数点的版本:yourString = yourString.replace(/[^0-9.]/g, ''); - Maxim Mai
1
晚来了,但也需要破折号和逗号。在某些地区,小数点是用逗号表示的:replace(/[^0-9.,-]/g, '' - Abdul Sadik Yalcin

30

去除所有非数字字符但保留小数点(并返回该数字)的简短函数:

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));


对我来说,这比被接受的答案更好,因为它保留了小数。 - Stefan
1
您可能还需要添加“-”,因为数字也可以是负数。 - Mob_Abominator
...但仅当“-”是第一个字符时。 - SherylHohman

6
这些答案的问题在于它们假设整数。但如果您需要浮点数,则上一个正则表达式将删除小数点。 为了纠正这个问题,您需要编写一个带有^的否定字符类。
var mystring = mystring.replace(/[^0-9.]/g, '');

4
在Angular / Ionic / VueJS中,我想到了一种简单的方法:
stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

在视图中的使用:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>

2

尝试

myString.match(/\d/g).join``

var myString = 'abc123.8<blah>'
console.log( myString.match(/\d/g).join`` );


这是如何工作的? - 1252748
@1252748 匹配将过滤所有数字并将它们放入数组中,join 将把数组元素粘合成单个字符串。 - Kamil Kiełczewski
我指的是使用反引号进行连接。那里发生了什么? - 1252748
@1252748 阅读有关:js 标记模板 的文章。 - Kamil Kiełczewski
是的,我见过标记模板,只是不理解使用它们连接时发生了什么。这只是为了节省两个字符,用单个参数 "" 调用 join 吗? - 1252748

2
很遗憾,以上所有答案都对我没用。
我想将货币数字从字符串转换为数字输出,例如$123,232,122.11(1232332122.11)或USD 123,122.892(123122.892)或任何货币,如₹ 98,79,112.50(9879112.5),包括小数点。
不得不自己编写正则表达式,看起来像这样:
str = str.match(/\d|\./g).join('');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接