问题
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
回答1:
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
s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*\\.)", "*")
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.
回答2:
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:
j***@e***.com
来源:https://stackoverflow.com/questions/43003138/regular-expression-for-email-masking