我试图用"*"掩盖电子邮件地址,但我在正则表达式上表现不佳.
input : nileshxyzae@gmail.com
output : nil********@gmail.com
Run Code Online (Sandbox Code Playgroud)
我的代码是
String maskedEmail = email.replaceAll("(?<=.{3}).(?=[^@]*?.@)", "*");
Run Code Online (Sandbox Code Playgroud)
但它给我的输出nil*******e@gmail.com我不知道这里出错了什么.为什么最后一个角色没有转换?也有人可以解释所有这些正则表达式的含义
Wik*_*żew 21
你的预测(?=[^@]*?.@)要求前面至少有一个字符@(见前面的点@).
如果删除它,您将获得所有预期的符号替换:
(?<=.{3}).(?=[^@]*?@)
Run Code Online (Sandbox Code Playgroud)
这是正则表达式演示(替换为*).
但是,正则表达式不是该任务的正确正则表达式.你需要一个正则表达式,它匹配前3个字符后的每个字符,直到第一个字符@:
(^[^@]{3}|(?!^)\G)[^@]
Run Code Online (Sandbox Code Playgroud)
查看另一个正则表达式演示,替换为$1*.在这里,[^@]匹配任何不是的字符@,所以我们不匹配地址abc@example.com.只有那些在用户名部分中有4个以上字符的电子邮件才会被屏蔽.
请参阅IDEONE演示:
String s = "nileshkemse@gmail.com";
System.out.println(s.replaceAll("(^[^@]{3}|(?!^)\\G)[^@]", "$1*"));
Run Code Online (Sandbox Code Playgroud)
And*_*ner 10
如果你对正则表达式不好,不要使用它们:)我不知道你是否听过这句话:
有些人在面对问题时会想"我知道,我会使用正则表达式".现在他们有两个问题.
(来源)
你可能会在这里获得正常的表达式,但今天你能理解它吗?明天?在六个月的时间?你的同事会吗?
一个简单的替代方案是使用a StringBuilder,我认为理解这里发生的事情要简单得多:
StringBuilder sb = new StringBuilder(email);
for (int i = 3; i < sb.length() && sb.charAt(i) != '@'; ++i) {
sb.setCharAt(i, '*');
}
email = sb.toString();
Run Code Online (Sandbox Code Playgroud)
"从第三个字符开始,用a替换字符,*直到到达字符串的末尾或@."
(你甚至不需要使用StringBuilder:你可以简单地操纵元素email.toCharArray(),然后在最后构造一个新的字符串).
当然,这并不正确的电子邮件地址,其中本地部分为少于3个字符的工作 - 它实际上然后掩盖域.
您的前瞻有点复杂。试试这个代码:
public static void main(String... args) throws Exception {
String s = "nileshkemse@gmail.com";
s= s.replaceAll("(?<=.{3}).(?=.*@)", "*");
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
O / P:
nil********@gmail.com
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15081 次 |
| 最近记录: |