人生第一篇——正则表达式
作为一名菜鸟,第一次写博客,难免有些激动,不安,写的有什么问题,还希望大神们多指点!
由于之前一直是用的时候才百度上搜索一下,相关字符语法,想想还是趁着这次需要,全部整理一下的,以备不时之需!顺便再熟悉一下。
为什么会用到正则表达式呢,还不是工作需要!任务是需要从日志中找出(手机号,身份证号,银行卡号,邮箱等)敏感信息!能想到的也唯有正则表达式了。
正则表达式功能强大,用的好可以减少很多很多很多工作,不论前端,后台!就是用这些简简单单的语法,自由组合拼凑出一个完整的世界。简直不能太美好。
废话了这么多,下来看看正则字符(从菜鸟教程抓来的):
1 非打印字符 2 \f 匹配换页符 3 \n 匹配换行符 4 \r 匹配回车符 5 \s 匹配任何空白字符,空格,制表符,换页符等。等价于【\f\n\r\t\v】 6 \S 匹配任何非空白字符 7 \t 匹配一个制表符 8 \v 匹配一个垂直制表符
1 特殊字符 2 $ 结束字符 3() 标识子表达式 4 ? 匹配 0 或者 1 个字符 5 . 匹配任意一个字符 6 * 匹配 0 个 或者 多个字符 7 ^ 表示匹配开始,中括号里标识 非 8 + 匹配多个 9 [ 中括号表达式 [1-9][0-9]+ 匹配数字 10 { 限定符的开始 o{0,1} 等价于o? 匹配 前面字符 0或者1次 11 | 指明两项之间的选择
1 定位符 2 \b 匹配一个单词边界,即字与空格间的位置。 3 g 正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。 4 i 不区分大小写 5 \d 匹配数字 6 \D 匹配非数字 7 \w 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。
在线测试工具:http://tool.chinaz.com/regex/
再看一下java版本的正则使用方法:
//拼写正则表达式
1 private String getMessageByPattern(String inputMessage){
2 long beginTime = new Date().getTime();
3 /******************************手机号正则开始*****************************/
4 String phone = "0?(13|14|15|17|18|19)[0-9]{9}";
5 Pattern ptPhone = Pattern.compile(phone);
6 //用于测试的输入字符串
7 //System.out.println("Input:" + inputMessage);
8 inputMessage = matchAndReplace(inputMessage, ptPhone);
10
11 /******************************身份证号正则开始*****************************/
12 String idcard = "/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|[xX])$/";
13 Pattern ptCard = Pattern.compile(idcard);
14 inputMessage = matchAndReplace(inputMessage, ptCard);
15
16 /******************************邮箱正则开始*****************************/
17 String email = "\\w[-\\w{1,2}]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}";
18 Pattern ptemail = Pattern.compile(email);
19 inputMessage = matchAndReplace(inputMessage, ptemail);
20
21 /******************************银行卡号正则开始*****************************/
22 //FIXME 如果有卡bin大全,这里应该更复杂一些,不过也是匹配开头的几位数
23 String bankcard = "([1-9]{1})(\\d{12,18})";
24 Pattern ptcard = Pattern.compile(bankcard);
25 inputMessage = matchAndReplace(inputMessage, ptcard);
26 long endTime = new Date().getTime();
27 return inputMessage;
28 }
//拿出匹配项,并且替换
1 private static String matchAndReplace(String inputPhone,Pattern p){ 2 Matcher m = p.matcher(inputPhone); 3 while(m.find()){ 4 //System.out.println(m.group()); 5 String value = m.group(); 6 String replace = ""; 7 if(value.length() <=11){ 8 replace = value.substring(0,2)+"***"+value.substring(5, 7); 9 }else{ 10 replace = value.substring(0,3)+"*****"+value.substring(8, 11); 11 } 12 inputPhone = inputPhone.replaceAll(value, replace); 13 //System.out.println(inputPhone); 14 } 15 return inputPhone; 16 }
接下来调用 getMessageByPattern(formattedMessage)方法就可以啦~~~
例子中的正则,完全可以根据正则字符读懂!
每一个正则表达式,都在那么几十个正则字符中变幻,看似很简单,但总会惧怕。
不下手你永远不知道,其实它确实很繁琐。
不下手你永远不知道,原来你也能掌握!