电子邮件屏蔽的正则表达式

Posted

技术标签:

【中文标题】电子邮件屏蔽的正则表达式【英文标题】:Regular expression for email masking 【发布时间】:2017-08-17 14:33:32 【问题描述】:

我正在尝试编写一个正则表达式来屏蔽电子邮件地址。下面的例子。

输入:john.doe@example.en.com

输出:j*********@e*********.com

我尝试了以下方法,但似乎无法正常工作。

正则表达式:(?<=.).(?=[^@]\*?@)

输出:j*******@example.en.com

正则表达式:(?<=.).(?=[^@]\*?)(?=[^\.]\*?\.)

输出:j******************.com

任何帮助将不胜感激。 demo

【问题讨论】:

试试.replaceAll("(?<=.).(?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$))(.)(?=.*\\.)", "*")(注意此评论中的垃圾字符,请勿从此处复制/粘贴) 正则表达式的使用对您来说有多重要?恕我直言.indexOf("@") 和一些“子字符串复制粘贴”可能会在几个月内变得更易读。 @DerMike 这不重要。我只是觉得我需要使用正则表达式。 @Wiktor 正则表达式有效。如果您将其作为答案提交,我将接受它。谢谢! 【参考方案1】:

更新各种屏蔽电子邮件解决方案

foo@bar.comf**@b**.com(当前问题)-s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*\\.)", "*")(见the regex demo)

foo@bar.comf**@b*r.com - s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*[^@]\\.)", "*")(见the regex demo)

foo@bar.comf*o@b*r.com - s.replaceAll("(?<=.)[^@](?=[^@]*?[^@]@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*[^@]\\.)", "*")(见the regex demo)

foo@bar.comf**@b*****m - s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?!$)", "*")(见the regex demo)

foo@bar.comf*o@b*****m - s.replaceAll("(?<=.)[^@](?=[^@]*[^@]@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?!$)", "*")(见the regex demo)

原答案

如果您不能使用基于代码的解决方案,您可以使用

s.replaceAll("(?<=.)[^@](?=[^@]*?@)|(?:(?<=@.)|(?!^)\\G(?=[^@]*$)).(?=.*\\.)", "*")

见regex demo

它的作用

(?&lt;=.)[^@](?=[^@]*?@) - 除@ ([^@]) 以外的任何字符,前面有任何单个字符 ((?&lt;=.)),后跟除@ 之外的任何 0 个或多个字符,直到 @ (@ 987654350@) | - 或 (?:(?&lt;=@.)|(?!^)\\G(?=[^@]*$)) - 匹配字符串中以 @ 开头的位置和任何字符 ((?&lt;=@.)) 或 (|) 上一个成功匹配 ((?!^)\\G) 的结尾,其后跟任何 0+ @ uo 以外的字符到字符串末尾 ((?=[^@]*$)) . - 任何单个字符 (?=.*\\.) - 后跟任何 0+ 个字符,直到字符串中的最后一个 . 符号。

【讨论】:

对于大多数电子邮件地址,\S+@\S+ 会不会也一样? @Robert:我不相信你可以用它来屏蔽。您可以使用它来提取大部分电子邮件。 @WiktorStribiżew,我们可以将 f@b.com 发送至*@*.**m的任何示例 @kakabali s.replaceAll("[^@.](?!$)", "*") @user2494863 如果要屏蔽第一个点之前的域部分,请使用(?&lt;=.)[^@\n](?=[^@\n]*?[^@\n]@)|(?:(?&lt;=@.)|(?!^)\G(?=[^@\n]*$))[^.](?!\.),请参阅demo。【参考方案2】:

如果您不需要与原始字符串具有相同字符数的掩码(更匿名),这个怎么样:

(?<=^.)[^@]*|(?<=@.).*(?=\.[^.]+$)

例如,如果您将匹配项替换为 ***,则结果将是:

j***@e***.com

【讨论】:

以上是关于电子邮件屏蔽的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

配置单元中的正则表达式替换解决方案以屏蔽前 6 个字符

JavaScript之基础-10 JavaScript 正则表达式(概述定义正则RegExp对象用于模式匹配的String方法)

是否有正则表达式来掩盖动态字母数字字符串的中间区域?

使用正则表达式验证电子邮件

java电子邮件提取正则表达式?

为啥 jQuery 的电子邮件验证正则表达式如此简单?