代码之家  ›  专栏  ›  技术社区  ›  Luis Antoni Del Águila Jacobo

Regex将电话号码替换为星号模式

  •  4
  • Luis Antoni Del Águila Jacobo  · 技术社区  · 8 年前

    我想对我的电话号码应用掩码,将一些字符替换为“*”。

    规范如下:

    电话输入 : (123) 123-1234

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

    我在尝试这种模式: "\B\d(?=(?:\D*\d){2})" 将匹配项替换为“*”

    但最终的输入是 (123)465-7891 -> (1**)4**-7*91

    与我想要的非常相似,但有两个额外的匹配项。我在想办法使用匹配零或匹配一次选项(??)但不知道怎么做。

    3 回复  |  直到 8 年前
        1
  •  5
  •   Gurmanjot Singh    8 年前

    尝试此正则表达式:

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

    将每个匹配项替换为 *

    Click for Demo

    说明:

    • (?<!\() -反向向后查找,以查找前面没有 (
    • \d -匹配数字
    • (?!$) -负向前看,查找未立即后跟可选数字并后跟行尾的位置
        2
  •  3
  •   Aaron    8 年前

    无环顾区的备选方案:

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

    我认为你应该尽可能避免四处张望。我发现它们的可读性较差,可移植性较差,通常性能较差。

    在regex101的php引擎上测试Gurman的regex和mine, mine completes in 14 steps 虽然 Gurman's completes in 80 steps

        3
  •  0
  •   Igor Dvorzhak    7 年前

    一些“快速”:

    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('');
    }