前段时间有小同事出去面试,微信发了我一个笔试题,需要给出结果,大概如下:
test = "userInfo";reg = "([a-z])([A-Z])";System.out.println(test.replaceAll(reg, "$1_$2").toLowerCase());
小同事大概觉得是应该输出user_info,但是又不确定,我回复他输出结果确实是这个。
我抱着好奇的心问了两个身边的同事,结果犹犹豫豫给不出答案,唉,所谓的高级工程师,竟然搞不懂正则分组捕获,反向引用。
在正则里,使用()可以捕获到匹配的组,分组按匹配结果按序号排列,分组1,分组2。。。。。
后面的$1,$2表示引用刚才匹配到的分组。
显然题中的正则表达式是匹配一个小写字母紧邻一个大写字母,并将原字符串的匹配项替换为以下划线连接,最后全部转换为小写。
最后使用分组捕获我们可以轻松将手机号脱敏处理,很容易可以将手机号按照数字个数分组,比如将手机号前三位分一组,后四位分一组,然后使用正则替换,把手机号中间4位变为*,保留前后两个捕获组。