正则表达式的使用详解

1.匹配  

       match(String regex)  ;

1  String tel="18600000111";
2        String reg="1[3578]\\d{9}";  //首字母1,第二字母3,5,7,8,后面都是数字共有9位
3        boolean b1 =tel.matches(reg);
4        System.out.println(b1);//输出结果true

 

2.切割  

       (1)切割一个或多个空格

1  String str ="aaa bbb  ccc ddd    eee";
2          String [] arr =str.split(" +");//“ +”表示至少有一个空格
3          for(String s:arr){
4               System.out.print(s); //输出aaabbbcccdddeee
5         }

 

       (2)通过.来切割字符串

 1 String str2="zhangsan.lisi.wangwu";
 2            /* \\是代表转义字符,如果你直接放split("."),是无法切割的,因为.在正则表达式中.有它特有的含义
 3                当你用转义之后\\.那么它就只代表一个点,而不具有特殊意义*/
 4            String [] arr2 =str2.split("\\.");
 5            for(String s:arr2){
 6                System.out.println(s);
 7            }
 8 
 9 /* 补充:在java中需要转义的除了.外,还有需要先转义不能直接切割的:
10   *     $  ( )  *  +  [ ]   ?    \  ^  { }  |  
11   *     这么几个大家用它来切割的时候,转义后就可以了
12   */

      (3)用重复项来切割

 1 String str3 ="wer#######tayuio****asdfg";
 2            String reg ="(..)"; //(.)代表第一个任意字符    \\1代表回去第一组数据  +代表1个或者多个      
 3            String [] arr3=str3.split(reg);
 4            for(String s:arr3){
 5                System.out.println(s);
 6           }
 7 
 8 /*:(.)的字符视为一个整体。 \\1代表回去第一组数据
 9 14  * 那它其实在这里也就代表(.),所以就相当于(.)(.)+,这里仅仅是相当于,也是为了好理解,其实他们还是有本质区别的
10 15  * 因为(.)==\\1,就是说如果.代表a,那么\\1也就代表a,而(.)≠(.),前面代表a后面可以代表b,因为前后两个点不是同一个点
11 */

 

3.替换  

     (1)把重复的数据 替换为#

1  String str="wer#####yw****fghj"; 
2             //把重复的数据 替换为#    
3             str=str.replaceAll("(.)\\1+", "#");//(.) 第一个任意字符   \\1 取第一组数据   +  1个或者多个
4             System.out.println(str) ;   //输出wer#yw#fghj

     (2)把重复项都变成单个

1 String str="wer#####yw****fg???hj"; 
2      //后一个参数的含义 可以通过$  数字引用第一个参数中的组,这个美元符号代表就是前面小括号里的内容
3                str=str.replaceAll("(.)\\1+", "$1");
4               System.out.println(str);    //输出wer#yw*fg?hj

     (3)电话号码中间几位用*表示

1 String str2="15889895644";//158****5644  
2            str2=str2.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
3            System.out.println(str2);// $1表示符号前面第一个小括号,$2代表第二个,如果有第三个小括号,那也可以$3;   //输出158****5644

 

4.获取

   (1)获取正则表达式所匹配的字符串

 1        String str="da jio zhu yi laa, ming tian  fang jia laa";
 2            //1.定义规则
 3            String reg="\\b[a-z]{3}\\b";//任意三个字符 \\b 是单词的边界(不明白为什么加这个)
 4            Pattern p =Pattern.compile(reg);
 5            //3.通过正则表达对象 获取匹配器对象   并把操作的字符串关联
 6            Matcher m =p.matcher(str);
 7            while(m.find()){  //find()用来搜索与正则表达式相匹配的任何目标字符串
 8            System.out.println(m.start()+"....."+m.group()+"..."+m.end());
 9            } //start()开始位置    group()用来返回包含了所匹配文本的字符串     end()结束位置
10            }
11     }
12  /* 有关: 在regex(正则表达式)包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。
13     //输出3.....jio...6
14 7.....zhu...10
15 14.....laa...17
16 35.....jia...38
17 39.....laa...42

 5、对于数字+汉字的组合,获取数字开头的部分:   /^[0-9]*/   ; 获取汉字结尾的部分 :   /[\u4E00-\u9FA5]*$/

 

6、用正则表达式来做数据校验

/**
     * 判定邮箱格式
     *
     * @param strEmail
     * @return
     */
    public static boolean isEmail(String strEmail) {
        String strPattern = "^[a-zA-Z][\\w\\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w\\.-]*[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z\\.]*[a-zA-Z]$";
        Pattern p = Pattern.compile(strPattern);
        Matcher m = p.matcher(strEmail);
        return m.matches();
    }

    /**
     * 判断是否是手机号
     *
     * @param mobile
     * @return
     */
    public static boolean isMobile(String mobile) {
        String regex = "^((13[0-9])|(15[0-9])|(18[0-9]))\\d{8}$";
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(mobile);
        return m.matches();
    }

    /**
     * 判断是否是身份证号码
     *
     * @param strEmail
     * @return
     */
    public static boolean isIdentify(String strEmail) {
        String strPattern = "(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])";
        Pattern p = Pattern.compile(strPattern);
        Matcher m = p.matcher(strEmail);
        return m.matches();
    }

    /**
     * 判断是否为网络链接
     *
     * @param url
     * @return
     */
    public static boolean isWebLink(String url) {
        Pattern pattern = Pattern
                .compile("http://(([a-zA-z0-9]|-){1,}\\.){1,}[a-zA-z0-9]{1,}-*");
        Matcher matcher = pattern.matcher(url);
        if (!matcher.find()) {
            return false;
        } else {
            return true;
        }
    }

 

补充:
正则表达式--验证手机号码:13[0-9]{9} 
实现手机号前带86或是+86的情况:^((\+86)|(86))?(13)\d{9}$ 
电话号码与手机号码同时验证:(^(\d{3,4}-)?\d{7,8})$|(13[0-9]{9})  
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)?   
提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*   
提取信息中的图片链接:(s|S)(r|R)(c|C)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)? 
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)     
提取信息中的中国手机号码:(86)*0*13\d{9}     
提取信息中的中国固定电话号码:(\d3,4|\d{3,4}-|\s)?\d{8}     
提取信息中的中国电话号码(包括移动和固定电话):(\d3,4|\d{3,4}-|\s)?\d{7,14}     
提取信息中的中国邮政编码:[1-9]{1}(\d+){5}     
提取信息中的中国身份证号码:\d{18}|\d{15}     
提取信息中的整数:\d+     
提取信息中的浮点数(即小数):(-?\d*)\.?\d+     
提取信息中的任何数字  :(-?\d*)(\.\d+)?   
提取信息中的中文字符串:[\u4e00-\u9fa5]*     
提取信息中的双字节字符串  (汉字):[^\x00-\xff]*

posted @ 2017-02-09 20:00  George93  阅读(249)  评论(0编辑  收藏  举报