Java的Regex --正则表达式

一、概述

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

    正则表达式所对应的类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"));
上一篇:ORB特征点提取算法试验


下一篇:高效的敏感词过滤方法(PHP)