人生第一篇——正则表达式

    作为一名菜鸟,第一次写博客,难免有些激动,不安,写的有什么问题,还希望大神们多指点!

    由于之前一直是用的时候才百度上搜索一下,相关字符语法,想想还是趁着这次需要,全部整理一下的,以备不时之需!顺便再熟悉一下。

    为什么会用到正则表达式呢,还不是工作需要!任务是需要从日志中找出(手机号,身份证号,银行卡号,邮箱等)敏感信息!能想到的也唯有正则表达式了。

    正则表达式功能强大,用的好可以减少很多很多很多工作,不论前端,后台!就是用这些简简单单的语法,自由组合拼凑出一个完整的世界。简直不能太美好。

废话了这么多,下来看看正则字符(从菜鸟教程抓来的):

1 非打印字符
2 f    匹配换页符
3 
    匹配换行符
4 
    匹配回车符
5 s    匹配任何空白字符,空格,制表符,换页符等。等价于【f

	v】
6 S    匹配任何非空白字符
7 	    匹配一个制表符
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      匹配一个单词边界,即字与空格间的位置。
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)方法就可以啦~~~ 

             例子中的正则,完全可以根据正则字符读懂!

             每一个正则表达式,都在那么几十个正则字符中变幻,看似很简单,但总会惧怕。

             不下手你永远不知道,其实它确实很繁琐。

             不下手你永远不知道,原来你也能掌握!

  

原文地址:https://www.cnblogs.com/10fly/p/9873054.html