3
votes

Remplacez chaque caractère capturé par *?

J'ai un e-mail et je souhaite remplacer chaque caractère entre la première lettre et @ à *. Exemple:

let h="john.smith@gmail.com".replace(/(.)(.*)@/,'$1*') 

console.log(h);

Voici mon code, mais il produit une étoile au lieu de plusieurs - je me suis collé dessus:

john.smith@gmail.com   ->  j*********@gmail.com

Des solutions?


2 commentaires

Astuce: divisez sur @ puis remplacez tous les caractères sauf un sur un côté par * . Vous pouvez également utiliser replace avec une fonction qui peut effectuer une substitution supplémentaire sur les pièces.


L'adresse e-mail est bien mieux masquée si vous utilisez un nombre fixe d'astérisques ( * ) avec le premier caractère.


6 Réponses :


2
votes

Vous pouvez passer un remplacement function dans String.prototype. remplacer , par exemple:

const result = 'john.smith@gmail.com'.replace(
    /^(.)(.*)(@.+)$/,
    (match, ...groups) => groups[0] + '*'.repeat(groups[1].length) + groups[2]
);
     
console.log(result);


0 commentaires

5
votes

Vous pouvez utiliser l'argument de rappel de replace:

let h = "john.smith@gmail.com".replace(/(.)(.*)@/, (_, first, rest) =>
    first + "*".repeat(rest.length) + "@"
); 

console.log(h);


0 commentaires

2
votes

Votre regex correspondra à la partie entière et la remplacera par une étoile. Au lieu de cela, vous voulez que l'expression régulière puisse correspondre à chaque caractère que vous souhaitez faire correspondre séparément. Cela fonctionnera:

let h="john.smith@gmail.com".replace(/(?<=^.+)(?<!@.*)[^@]/g,'*') 
    
console.log(h);

Pour décomposer l'expression régulière:

(? correspondra au début de la chaîne, au premier caractère et à n'importe quel nombre de caractères après en utilisant un regard positif en arrière. Ce concept fonctionnera pour correspondre à la chaîne mais ne sera pas inclus dans la correspondance résultante.

(? est un regard négatif pour s'assurer que nous ne le faisons pas correspond à tout ce qui suit le symbole @.

[^ @] correspond à tout caractère qui n'est pas @.

g à la end signifie global, ce qui le fait correspondre à n'importe quel nombre de fois au lieu d'une seule.


0 commentaires

2
votes

Je viens d'écrire:

let e = Array.from("john.smith@gmail.com").reduce((arr, char, index) => arr.concat(arr.includes('@') || char === '@' ? char : index === 0 ? char : '*'), []).join('');

console.log(e)


0 commentaires

1
votes

Un simple remplacement de regex fera:

let h="john.smith@gmail.com".replace(/(?!^).(?=.*@)/g, '*') 
console.log(h);

  • (?! ^) - pas le début de la chaîne
  • . - tout caractère sauf un caractère de saut de ligne
  • (? =. * @) - immédiatement à droite, il doit y avoir plus de 0 caractères autres que les caractères de saut de ligne, puis un @ .

Voir la démo en ligne de regex .

p >


5 commentaires

Votre regex / (?! ^) [^ @] (? = [^ @] * @) / G était également sympa


@ KamilKiełczewski Comme le nom d'utilisateur peut contenir @ , celui actuel est le meilleur de toutes les solutions publiées.


Je ne considère pas le cas avec deux @ mais, j'ai fait le test: "john.s @ mith @ gmail.com" .replace (/(?!^)(?=.+@)./ g, '*' ) (réponse de Samir) - et j'obtiens un résultat correct - donc je ne comprends pas -? L'idée dans la réponse de Samir était la meilleure (et il l'a montré en premier)


@ KamilKiełczewski Vous n'utilisez pas la solution de Samir.


Solution Samir directement: "john.s @ mith @ gmail.com" .replace (/(?!^.)(?=.+@)./ g, '*') -> < code> "j ********** @ gmail.com" (exécuté dans la console Chrome) - où est le problème?



3
votes

Un indicateur global est ce qui vous manque dans votre expression régulière.

J'ai cette expression régulière à un seul coup qui fait le travail:

let h = "john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*');

console.log(h);
  • Prévision négative pour exclure le premier caractère.
  • Regard positif pour tous les caractères précédant le @ char.
  • Indicateur global pour remplacer toutes les captures.

"john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*')


2 commentaires

Merci, bonne réponse :) Votre expression régulière peut même être simplifiée en /(?!^)(?=.+@)./g . Les réponses d'autres personnes avant vous étaient également gentilles et m'ont causé l'effet "eureka" et m'ont fait sortir de l'impasse mentale, et apprenez-moi beaucoup :)


Heureux de vous aider et merci pour le conseil de simplification;)