I am trying to write a regular expression to mask an email address. Example below.
input: john.doe@example.en.com
output: j*******@e*********.com
I have tried the following but I just can't seem to get it working correctly.
regex:
(?<=.).(?=[^@]\*?@)
output:j*******@example.en.com
regex:
(?<=.).(?=[^@]\*?)(?=[^\.]\*?\.)
output:j******************.com
Any help would be appreciated. demo
Update with various masking email solutions
foo@bar.com
⇒f**@b**.com
(current question) -s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*\\.)", "*")
(see the regex demo)foo@bar.com
⇒f**@b*r.com
-s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*[^@]\\.)", "*")
(see the regex demo)foo@bar.com
⇒f*o@b*r.com
-s.replaceAll("(?<=.)[^@](?=[^@]*?[^@]@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*[^@]\\.)", "*")
(see the regex demo)foo@bar.com
⇒f**@b*****m
-s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?!$)", "*")
(see the regex demo)foo@bar.com
⇒f*o@b*****m
-s.replaceAll("(?<=.)[^@](?=[^@]*[^@]@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?!$)", "*")
(see the regex demo)Original answer
In case you can't use a code-based solution, you may use
See the regex demo
What it does:
(?<=.)[^@](?=[^@]*?@)
-any char other than@
([^@]
) that is preceded by any single char ((?<=.)
) and is followed with any 0 or more chars other than@
up to a@
((?=[^@]*?@)
)|
- or(?:(?<=@.)|(?!^)\\G(?=[^@]*$))
- match a location in the string that is preceded with@
and any char ((?<=@.)
) or (|
) the end of the previous successful match ((?!^)\\G
) that is followed with any 0+ chars other than@
uo to the end of string ((?=[^@]*$)
).
- any single char(?=.*\\.)
- followed with any 0+ chars up to the last.
symbol in the string.How about this one if you do not need the masks having the same number of characters of the original strings (which is more anonymous):
For example, if you replace the matches with
***
, the result would be: