Java的Regex

一、概述 正则表达式通常被用来对字符串提供范围性的校验、替换那些符合某个模式(规则)的文本。 正则表达式所对应的类Pattern,所有的正则表

一、概述

    正则表达式通常被用来对字符串提供范围性的校验替换那些符合某个模式(规则)的文本。

    正则表达式所对应的类Pattern,所有的正则表达式都是在这个类下创建的。Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。

   Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作。Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。

 完成使用方法如下:

         String str = "abc";
        //指定校验格式
         Pattern p = Pattern.compile("abc");
         //将当前的规则和判断字符串进行匹配
         Matcher m = p.matcher(str);
         //进行判断
         boolean b = m.matches();
         System.out.println(b);

二、正则表达式常用符号介绍

  1、[ ] 表示匹配括号中的任意一个字符。比如:

      [a - z ]:表示匹配任意一个小写字母。

  2、^字符:如果用在[ ]内表示非;如果^放在了整个表达式的开头,表示强制以当前字符开头。比如:

    [^a-z]:表示除了小写字母以外的字符;^[a-z]则表示以小写字母开头。

  3、预定义符号:

  • .:表示任意字符;
  • \w:表示单词字符 [a-zA-Z_0-9] 
  • \d:表示数字[0-9];
  • \s:表示空白字符:[ \t\n\x0B\f\r]
  • \D:表示非数字: [^0-9]
  • \W:表示非单词字符:[^\w]
  • \S:表示非空白字符:[^\s]

    示例如下:

public static void main(String[] args) {
        String str = "\\\\";
        //1. 字符串是由3个字符组成:第一个字符只能从a/b/c,第二个字符只能由r/s/t
        // 第三个字符是数字
        // [xyz] - 表示可以是x/y/z中的任何一个
        // [a-b] - 按照码表从a开始一直找到b
        //System.out.println(str.matches("[abc][rst][0-9]"));

        // 1.判断一个字符串是否是由一个小写字母组成
        // System.out.println(str.matches("[a-z]"));
        
        // 2. [^abc]表示除了a/b/c
        // System.out.println(str.matches("[^a-zA-Z]"));
        
        //3. 字符串由三个组成,第一个是字母,第二个是数字,
        //“.”表示任意一个字符
        //System.out.println(str.matches("[a-zA-Z][0-9]."));
        
        //4.判断字符串是否只有一个字符
        //System.out.println(str.matches("."));
        
        //匹配.
        //\\. 经过java编译就变成了\.,正则再转义成. 表示.
        //System.out.println(str.matches("\\."));
        
        //\\\\java编译\\;\\正则编译后\
        // \\\\ -> \\ -> \ 
        //System.out.println(str.matches("\\\\"));
        System.out.println(str.matches("\\w"));
        System.out.println(str);
    }

 

   4、数量词:

  • +:表示1次到多次 {1,};
  • *:表示0次多到次 {0,};  
  • ?:表示0次到一次 {0,1};
  • {n}:表示有且只有n次;
  • {n,}:表示n次及其以上;
  • {n,m}表示n-m次之间。

     示例如下:

    

public static void main(String[] args) {
        String str = "dasfd";
        //1. {5}恰好由n次
        System.out.println(str.matches("[a-zA-Z]{5}"));        
        //2. 至少由5个字母组成的字符串
        //System.out.println(str.matches("[a-zA-Z]{4}[a-zA-Z]+"));        
        System.out.println(str.matches("[a-zA-Z]{5,}"));
        
        //3.由6-12个字符组成
        System.out.println(str.matches(".{6,12}"));
    }

二、捕获组

      捕获组的特征:

      1、用()括起来的单元称之为捕获组;

      2、在正则表达式中,会对捕获组进行自动编号,编号从1开始。这与大多数的编号从0开始不同。

      3、\n表示引用编号为n的捕获组;

      4、捕获组的编号从(左括号的出现位置开始依次计数。

     捕获组往往用于叠字的判断,示例如下:

        //{2,} -- 至少两个字符  
        //(.)\\1+ 表示叠字
        String str1 = "娃哈哈";
        System.out.println(str1.matches(".*(.)\\1+.*"));
        //AABB 高高兴兴
        
        String str2 = "高高兴兴";
        System.out.println(str2.matches(".*(.)\\1(.)\\2.*"));
        //abab 休息休息 (..)任意两个字符
        String str3 = "休息休息";
        System.out.println(str3.matches("(..)\\1"));

 三、正则表达式和String结合后的使用

      使用Pattern和Matcher的方式匹配太过繁琐,我们往往使用字符串直接匹配的方法进行判断。

     1、字符替换

        将String字符串中的字符进行替换,返回一个新的字符,原字符串不变。例如:

       String str = "asfsafasf12sad17--";
        //将字符串替换为--
        System.out.println(str.replaceAll("\\d", "-"));
        //将字符串中的所有的数字去掉;参数:正则表达式
        System.out.println(str.replaceAll("\\d", ""));
        //所有非数字替换掉
        System.out.println(str.replaceAll("\\D", ""));
        
        String sub = str.replaceAll("\\D", "");

       2、对字符串进行切割

       以某字符或数字作为切割符将字符串进行切割成多个子串,返回一个子串数组。例如:

        //切割
        String str = "40asfas40as1fasdcer4";
        //以数字为切割符将字符串切割成多个子串
        //作为切割符的字符会被整个切掉
        //如果切割符在字符串的尾部,会被直接切掉
        String[] arr = str.split("\\d");
        System.out.println(arr.length);
        for(String s : arr) {
            System.out.println(s);
        }

    3、使用$引用上一个捕获组,对字符串进行去重和颠倒

       将字符串中的多个连续的字符去掉,或者将单词进行颠倒。比如:

        String str = "Cat Dog";
        
        //将cat和dog的位置进行颠倒
        //在替换过程中,\n的形式不起作用
        //在替换过程中,如果想要引用上一个捕获组,那么需要使用$n的形式
        System.out.println(str.replaceAll("(Cat)(.*)(Dog)", "$3$2$1"));
        String str1 = "我我我我爱爱学学学学习习";
        System.out.println(str1.replaceAll("(.)\\1+", "$1"));