2016-07-21 11 views
1

次の関数は、+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目的)の使用を避けたいと思います。私は、同じ関数が正規表現を使用して実行できるかどうか疑問に思っていますか?

私はすでに

([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' 

それとも少し楽目に(に触発された件の他の回答):正規表現+交換に

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}を変数で置き換える必要があります。私は\\とエスケープする必要があることを読む、私は右ですか? –

+1

@ XimaBrabTobraパラメーター化された長さをサポートするように改訂されました。しかし、私はThomas Ayoubの非正規表現の解がより読みやすいと言わなければなりません。要するに、ここでは文字列操作に対する正規表現の本当の利点は見られません。 – 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);

関連する問題