web-dev-qa-db-ja.com

RegExを使用して文字列の一部をマスクする

JavaScriptを使用して文字列の一部をマスクしようとしています。

例えば正規表現を使用して、次のようにクレジットカード番号の2番目と3番目のセグメントをマスクします。

  • _4567 6365 7987 3783_→_4567 **** **** 3783_
  • _3457 732837 82372_→_3457 ****** 82372_

最初の4つの数字と最後の5文字だけを残しておきたいだけです。

これは私の最初の試みです:/(?!^.*)[^a-zA-Z\s](?=.{5})/g

https://regex101.com/r/ZBi54c/2

7
Josue Soriano

あなたはこれを試すことができます:

var cardnumber = '4567 6365 7987 3783';
var first4 = cardnumber.substring(0, 4);
var last5 = cardnumber.substring(cardnumber.length - 5);

mask = cardnumber.substring(4, cardnumber.length - 5).replace(/\d/g,"*");
console.log(first4 + mask + last5);
4
Tony

最初の4桁をスライスして、残りの数字を置き換えることができます。

console.log(
    ['4567 6365 7987 3783', '3457 732837 82372'].map(
        s => s.slice(0, 4) + s.slice(4).replace(/\d(?=.* )/g, '*')
    )
);
1
Nina Scholz

答えは明らかにOPを満たしています。正規表現のみを使用する別のソリューションは次のとおりです。

function starry(match, gr1, gr2, gr3) {
  var stars = gr2.replace(/\d/g, '*');
  return gr1 + " " + stars + " " + gr3;
}

function ccStarry(str) {
  var rex = /(\d{4})\s(\d{4}\s\d{4}|\d{6})\s(\d{4}|\d{5})/;

  if (rex.test(str))
    return str.replace(rex, starry);
  else return "";
}


var s1 = "4567 6365 7987 3783";
var s2 = "3457 732837 82372";
var s3 = "dfdfdf";
console.log(ccStarry(s1));
console.log(ccStarry(s2));
console.log(ccStarry(s3));

これにより、置換を試みる前にパターンが一致することが保証されます。たとえば、3番目のテストケースでは、空の文字列を返します。パターンは、質問で指定されたもの以外の他のクレジットカードパターンと一致するように更新できます。

0
jrook