持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
一、前言
在对接项目的过程中,有时后端返回的数据不是我们想要的结构,又或者我们只需要其中的某些信息,这时如果有好用的正则表达式,配合字符串的函数,那既不是事倍功半,我们能轻易地将需要的信息提取出来。
今天就带大家伙看看。
二、方法
1、match函数
比如现在有个字符串a
a = 'safahj124+500~241jkl134+500(测试字符串c1.1)'
它中间一共有124,500,241,134,500,1.1六个数字,是我们需要提取出来的信息。
那我们可以用以下的正则表达式,第一个\d表示只匹配数字,括号内表示支持匹配小数点,+号表示,可重复匹配多位小数,最后的问号表示重复零次或一次前面的操作,g表示全局匹配。
b = a.match(/\d(.\d+)?/g)
如果想保留124和500之间的+号,那就需要下面的写法,在第一个\d后面加上+号
b = a.match(/\d+(.\d+)?/g)
2、replace
假设现在有个字符串c
c="测试sab124.22司空见惯"
可以用replace配合正则表达式,将不匹配的字符替换掉,[^x]表示匹配除x之外的字符, 放到这里是就是[^\d.]匹配除数字和.之外的字符,把这些字符替换成空,就剩下我们需要的数字啦。
d=c.replace(/[^\d.]/g,'')
3、parseFloat、parseInt
如果是这样的字符串e
e = "114.514苏果卡就两个"
数字在前面的情况,那还可以直接用parseFloat函数哦
f = parseFloat(e)
这里还能顺便给提取出来的数字做好类型转换,前面两种提取出来的数字还是字符串类型的。
如果是数字在后面的,情况,使用这个parseFloat只能得到NaN
同理parseInt也可以,不过只会得到114这个结果
同时需要注意,parseInt还支持第二个参数,是进制的
我们举个例子
e = "0x114.514苏果卡就两个"
字符串e最前面的0x,是16进制的字符,那我们用parseInt就会读到114(是16进制的,换成十进制是276),最后返回一个十进制的276回来。
如果我们限定了进制,则返回第一个数字0
f = parseInt(e,10)
三、小结
从字符串中提取数字,基本就是这三种方法,match匹配想要的数字,replace将非数字的部分替换掉,这两者都需要正则表达式做支持,最后的parseFloat和parseInt属于是取巧了,但在一定场景下也能使用。具体选用什么方式完成需求,就看各位自己的选择啦。
ps: 我是地霊殿__三無