Regex带有星号的电话号码

Regex phone number with stars

本文关键字:电话号码 Regex      更新时间:2023-09-26

下面的函数将电话号码(如+332886487648)转换为+332******48。

formatPhoneWithStar = function(phone) {
    const prefixLength = 4;
    const suffixLength = 3;
    const prefix  = phone.substring(0, prefixLength);
    const suffix  = phone.slice(-suffixLength);
    const nbStars = phone.length - (prefixLength + suffixLength);
    let formattedPhone = prefix;
    for (let i = 0; i < nbStars; i++) {
       formattedPhone += '*';
    }
    formattedPhone += suffix;
    return formattedPhone;
}

但是,我希望避免使用forloop(nodeJS目的)。我想知道是否可以使用正则表达式来完成相同的函数?

我已经试过一些像这样的

([0-9]{3})([0-9]{4})([0-9]{3})'w+

然后我想使用$1和$3,比如$1+[如何生成星]+$3。有人知道在不使用for循环和regex的情况下这是否可行吗?

谢谢你的帮助。

这里不需要使用regex,只需使用"*".repeat(nbStars):

phone ="+33286487648";
prefixLength = 4;
suffixLength = 3;
prefix  = phone.substring(0, prefixLength);
suffix  = phone.slice(-suffixLength);
nbStars = phone.length - (prefixLength + suffixLength);
formattedPhone = prefix + "*".repeat(nbStars) + suffix;
console.log(formattedPhone);

您可以传入一个替换函数:

'+33286487648'.replace(/^('+?'d{3})('d+)('d{2})$/, function() {
  return arguments[1] + arguments[2].replace(/./g, '*') + arguments[3];
}); // Produces '+332******48'

或者可能对眼睛更容易一点(受其他答案中.repeat的启发):

function hideMiddle(string, prefixLength, suffixLength) {
  var re = new RegExp('^(''+?''d{' + prefixLength + '})(''d+)(''d{' + suffixLength + '})$');
  return string.replace(re, function(match, prefix, middle, suffix) {
    return prefix + '*'.repeat(middle.length) + suffix;
  });
}
console.log(hideMiddle('+33286487648', 3, 2));
console.log(hideMiddle('+33286487648', 1, 1));

使用正则表达式+替换:

    var phone = "+33286487648";
    var m = phone.match(/('+'d{3})('d+)('d{3})/);
    var res = m[1] + '*'.repeat(m[2].length) + m[3];
    console.log(res);