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?
6 Réponses :
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);
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);
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.
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)
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 >
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?
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);
"john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*')
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;)
Astuce:
divisezsur@puis remplacez tous les caractères sauf un sur un côté par*. Vous pouvez également utiliserreplace code>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.