由于与第三方接洽,发现,三方数据中手机号mobile的值非常不规范,其中包括:手机号前后有空格、手机号中间有空格(130 2773 4666)、手机号中间存在特殊字符(130-2773-4666)等等;
数据产生的原因不再追问,问题是,我们需要在这毫无规则的字符串中提取出手机号,所以有了下述的提取数字的函数
提取字符串中的数字(不完全版)
module.exports = {
onlyNumber(str) {
return str.replace(/[^0-9]/gi, '');
}
};
[^0-9]/ig是“非数字”的正则表达式类,在onlyNumber函数中,将删除字符串中任何位置的非数字字符;
看似完美,但是有一个小问题,当onlyNumber入参为null、undefined或无入参,函数就会报错
TypeError: Cannot read property 'replace' of undefined
所以,在函数内部增加了一个判断,如果是字符串,则进行转化,如果不是字符串,则直接返回原值;
提取字符串中的数字(完全版)
module.exports = {
onlyNumber(str) {
return str && str.replace(/[^0-9]/gi, '');
}
};
输出:
module.exports.onlyNumber(); //undefined
module.exports.onlyNumber(null); //null
module.exports.onlyNumber(undefined);//undefined
module.exports.onlyNumber('');//
module.exports.onlyNumber('12d dd3-3*2 1-');//123321
提取字符串中非数字的字符
module.exports = {
onlyString(str) {
return str && str.replace(/\d/g, '');
}
};
\d是“数字”的正则表达式类,在onlyString函数中,将删除字符串中任何位置的数字字符;
题外话
如果你不知道&&是怎么回事,看这里:https://www.yuque.com/morange/morange/ra8vtf
如果你不知道正则,看这里:https://www.yuque.com/morange/morange/tw78ov