正则表达式用星号模式替换电话号码

时间:2018-02-09 13:56:32

标签: regex

我想在我的电话号码上应用一个掩码,用“*”替换一些字符。

规范是下一个:

电话录入:(123)123-1234

输出 :( 1 **)*** - ** 34

我尝试使用此模式:"\B\d(?=(?:\D*\d){2})"并将匹配替换为“*”

但最终输入类似于(123)465-7891 -> (1**)4**-7*91

非常相似,但有两个额外的比赛。我想找到一种方法来使用匹配零或一次选项(??)但不确定如何。

3 个答案:

答案 0 :(得分:5)

试试这个正则表达式:

(?<!\()\d(?!\d?$)

将每个匹配项替换为*

<强> Click for Demo

<强>解释

  • (?<!\() - 在(
  • 之前找不到紧前面的位置
  • \d - 匹配数字
  • (?!$) - 负面预测,找不到紧跟一个可选数字后跟行尾的位置

答案 1 :(得分:3)

替代方案没有外观:

  • 匹配\((\d)\d{2}\)\s+\d{3}-\d{2}(\d{2})
  • 替换为(\1**) ***-**\2

在我看来,你应尽可能避免使用外观。我发现它们的可读性较差,便携性较差,性能也较差。

测试Gurman的正则表达式和我的regex101的php引擎,mine completes in 14 steps Gurman's completes in 80 steps

答案 2 :(得分:-1)

一些“怪胎”:

function maskNumber(number){
    var getNumLength = number.length;
    // The number of asterisk, when added to 4 should correspond to length of the number
    var asteriskLength = getNumLength - 4;
    var maskNumber = number.substr(-4); 
    for (var i = 0; i < asteriskLength; i++) maskNumber+= '*';

    var mask = maskNumber.split(''), maskLength = mask.length;
    for(var i = maskLength - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var tmp = mask[i];
        mask[i] = mask[j];
        mask[j] = tmp;
    }

    return mask.join('');
}