正则expression式与星星的电话号码
以下function将电话号码(例如+33286487648)转换为+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的用途)。 我想知道是否可以使用正则expression式来完成相同的function?
我已经尝试了几个像
([0-9]{3})([0-9]{4})([0-9]{3})\w+
然后我想用$ 1和$ 3如$ 1 + [如何生成星星] + $ 3。 有没有人知道如果这是可行的,而不使用for循环和使用正则expression式?
感谢您的帮助。
不需要在这里使用正则expression式,只需使用"*".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);
你可以传入一个replace函数 :
'+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));
用正则expression式+replace:
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);