2016-07-21 2 views
1

следующая функция преобразует телефонный номер, например +33286487648, в +332 ****** 48.Номер телефона Regex со звездами

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; 
} 

Однако я хотел бы избежать использования шлюза (цель узла nodeJS). Мне интересно, можно ли выполнять одну и ту же функцию с помощью регулярных выражений?

Я уже попробовал несколько из них, как

([0-9]{3})([0-9]{4})([0-9]{3})\w+ 

, а затем я хотел бы использовать $ 1 и $ 3, такие как $ 1 + [как генерировать звезды] + $ 3. Кто-нибудь знает, можно ли это сделать без использования цикла for и использования регулярных выражений?

Благодарим за помощь.

+2

[Это] (https://regex101.com/r/ vO9mS6/1)? –

+1

Да, это то, что я до сих пор на веб-сайте регулярных выражений. Теперь, как я могу использовать это в своей функции? –

ответ

2

Нет необходимости использовать регулярное выражение здесь, просто используйте "*".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);

2

Вы можете пройти в replacement function:

'+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));

+0

Мне очень нравится ваше решение! Однако мне нужно заменить {3} на переменную. Я читал, что нужно бежать с \\, am ii правильно? –

+1

@XimaBrabTobra Пересмотрен для поддержки параметризованных длин. Однако я должен сказать, что нерепрессивное решение Томаса Айуба более читаемо. Короче говоря, я не вижу реальной выгоды от регулярного выражения над строковыми манипуляциями здесь. – jensgram

0

С регулярным выражением + замена:

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

Смежные вопросы