ChatGPT解决这个技术问题 Extra ChatGPT

从 JavaScript 中的字符串中去除所有非数字字符

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

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

//desired output is 1238

你将如何在纯 JavaScript 中实现这一点?请记住这是一个非 DOM 场景,因此 jQuery 和其他涉及浏览器和按键事件的解决方案不适合。


c
csj

将字符串的 .replace 方法与正则表达式 \D 一起使用,它是匹配所有非数字的速记字符类:

myString = myString.replace(/\D/g,'');

谢谢csj;在哪里可以找到有关 \D 的更多信息?
这是我的默认正则表达式参考:regular-expressions.info/reference.html 每个内置字符类都有内置补码。 \d \D(数字与除数字之外的所有内容) \w \W(单词字符与除单词字符之外的所有内容) \s \S(空格与除空格之外的所有内容)
为了清楚起见,这里是替换的语法:w3schools.com/jsref/jsref_obj_regexp.asp,因为正斜杠和“g”是该命令的一部分,而不是 RegEx 的一部分。
replace 是否在所有浏览器中都使用这种精确的语法?似乎我记得在旧版本的 IE 中使用它和我用 jQuery 抓取的文本时得到一个 object has no method 'replace' ......或类似的东西。
@cwd 我不知道过去或当前的浏览器支持什么。该问题指定了非 DOM 上下文,因此发帖人很可能是在非 Web 浏览器环境中编写脚本。
m
max4ever

如果你需要这个来为浮点数留下点,使用这个

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

任何正则表达式专家?如何使它只允许一个点(与数字非常相关)。谢谢!
你是什么意思?给出输入输出示例
不好:"aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9. 应该去掉任何可能围绕数字的字符串。
@max4ever 你救了我的命,感谢您处理 -(负)数字案例 :)
@Kasperi 也许:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A
Auraseer

如果您的脚本实现支持它们,请使用正则表达式。就像是:

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

由于某种原因,这种方式似乎比 [^\d] 更具可读性。
正则表达式分隔符后的 g 是什么?
不适用于浮点/十进制值,例如,“7.6$”将返回 76
就像提到的@SikandarTariq 一样,但也有负值。
C
Christian C. Salvadó

您可以使用正则表达式来 replace 所有非数字字符:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238

J
Jan Hančič

类似于以下内容:

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

不完全是原始问题的答案,而是处理小数点的版本:yourString = yourString.replace ( /[^0-9.]/g, '' );
迟到但也需要破折号和逗号。在某些地区,小数用逗号完成:replace(/[^0-9.,-]/g, ''
j
jackosaur

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

parseNum = str => +str.replace(/[^.\d]/g, '');让 str = 'a1b2c.d3e';控制台.log(parseNum(str));


对我来说,这比公认的答案要好,因为它保留了小数点。
您可能还想添加“-”,因为数字也可以是负数。
...但前提是 - 是第一个字符
G
Grant

在 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>

C
Chaos Legion

不幸的是,以上答案都不适合我。

我正在寻找从像 $123,232,122.11 (1232332122.11) 或 USD 123,122.892 (123122.892) 或像 ₹ 98,79,112.50 (9879112.5) 这样的任何货币的字符串转换货币数字,以给我一个数字输出,包括十进制指针。

必须制作我自己的正则表达式,看起来像这样:

str = str.match(/\d|\./g).join('');

K
Kamil Kiełczewski

尝试

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

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


j
jeffbRTC

这个,

.match(/\d|\.|\-/g).join('');

同时处理 ,. 以及 -

例子:

"Balance -$100,00.50".match(/\d|\.|\-/g).join('');

输出

10000.50


D
Debbie Kurth

上面这些答案的问题在于它假设整数。但是如果你需要一个浮点值,那么前面的 reg 字符串会去掉小数点。

要更正此问题,您需要使用 ^ 编写一个否定字符类

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

F
Frank Wisniewski

我们在 2017 年现在你也可以使用 ES2016

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

或者

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

结果是

1238

这是进行此操作的一种非常低效的方法。
它通过备用方法将字符串转换为单字符串数组,然后通过 JavaScript 对每个数组项应用过滤器函数,返回一个新的字符串数组,最后将该数组重新连接成一个字符串。正则表达式接受一个字符串并返回一个字符串,处理是通过本机代码完成的。