我想在我的电话号码上应用一个掩码,用“*”替换一些字符。
规范是下一个:
电话录入:(123)123-1234
输出 :( 1 **)*** - ** 34
我尝试使用此模式:"\B\d(?=(?:\D*\d){2})"
并将匹配替换为“*”
但最终输入类似于(123)465-7891 -> (1**)4**-7*91
非常相似,但有两个额外的比赛。我想找到一种方法来使用匹配零或一次选项(??)但不确定如何。
答案 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('');
}