java - 用正则表达式打印Java中的第二个字符和最后四个字符的屏蔽电话号码
问题描述
我正在尝试使用正则表达式来打印字符串的第二个字符和最后四个字符。
这是我拥有的正则表达式,它只打印 + 和字符串的最后四个:
s.replaceAll("\\w(?=\\w{4})", "*");
我正在使用:“+13334445678”作为测试虚拟数据。
我希望它是:+1******5678 我得到:+*******5678
我究竟做错了什么?
解决方案
使用单个正则表达式屏蔽电话号码可能很复杂。一段时间后,可能需要一段时间才能回忆起 regexp(?<!^\+)[0-9](?=[0-9]{4})
的作用
更直接的解决方案是使用substring
方法和简单的替换replaceAll("\\d", "*")
:
private static String maskPhoneNumber(String tel) {
if (tel.length() < 6) {
return tel;
}
return tel.substring(0, 2)
+ tel.substring(2, tel.length() - 4).replaceAll("\\d", "*")
+ tel.substring(tel.length() - 4);
}
例子
maskPhoneNumber("+13334445678"); // +1******5678
maskPhoneNumber("+1-333-444-5678"); // +1-***-***-5678
maskPhoneNumber("+1 (333) 444-5678"); // +1 (***) ***-5678
如果您不想保留电话号码格式(破折号、空格、括号),请使用添加一个替换 ( replaceAll("[^\\d]", "")
):
tel.substring(0, 2)
+ tel.substring(2, tel.length() - 4)
.replaceAll("[^\\d]", "")
.replaceAll("\\d", "*")
+ tel.substring(tel.length() - 4);
例子
maskPhoneNumber("+13334445678"); // +1******5678
maskPhoneNumber("+1-333-444-5678"); // +1******5678
maskPhoneNumber("+1 (333) 444-5678"); // +1******5678
这种命令式代码不像单个正则表达式那么优雅,但可能更容易被任何开发人员理解。
推荐阅读
- rust - 重用原始指针来补充 Rust Box
- visual-studio - 如何在 Visual Studio 2019 中为非 ASP.Net 项目文件夹设置具有浏览器刷新的实时服务器?
- javascript - 为什么 HTML 元素 X 位置值翻倍 (x2) 在从 Angular CDK 拖放中拖动释放事件后更新其 X 位置值时?
- ios - 原生 iOS 日志未在 Flutter 项目中显示
- c# - Xamarin.Forms 不编译 Android 项目
- java - Jersey 3 - 使用 bindFactory 配置绑定
- go - 在 golang 中,在自定义类型上实现方法,因此不需要在 Println 中强制转换
- python - 引用从拆分数据帧的函数返回的输出
- java - 如何在 Android Studio 中向 ListView(每个列表)添加复选框
- selenium - 在 k8s 中使用 selenium/standalone-chrome