正则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);