正则表达式(全集)

正则表达式(优秀有奇效)

1. 什么是正则表达式

  1. 正则表达式是对字符串执行模式匹配的技术。所谓模式匹配个人理解就是找出符合所指定规律的字符串。
  2. 奇效:把数小时辛苦而易错的文本处理工作缩短在几分钟。而且不仅java语言支持

2. 正则表达式符号作用(分类)

  1. 字符匹配符
    字符匹配符,人如其名,说的就是要选择匹配哪些字符,给出一个匹配字符的集合。
    正则表达式(全集)_第1张图片
    正则表达式(全集)_第2张图片
    注意
    (1) java正则表达式中,两个“\”即"\“表示其它语言中的一个”"。需要用到转义字符的有. * + ( ) $ / \ ? [ ] ^ { }
    (2) “-“字符当不是在两个字符之间时,仅表示匹配”-”

  2. 限定符
    对字符进行限定:出现了多少次。
    正则表达式(全集)_第3张图片

  3. 选择匹配符
    重点突出选择性:你可以选择这个,也可以选择那个,这时候使用选择匹配符
    在这里插入图片描述

  4. 定位符
    定位符就是要确定位置:要匹配字符串出现的位置,在最开始出现还是在最后?
    正则表达式(全集)_第4张图片

  5. 分组组合
    分组,也就是说对匹配模式进行分组。
    正则表达式(全集)_第5张图片
    正则表达式(全集)_第6张图片

3.正则表达式的使用

例子1:

// matcher和pattern使用方法
public class RegExp02 {
    public static void main(String[] args) {
        String content = "abc$(a.bc(123( )";
        //匹配( => \\(
        //匹配. => \\.
        //String regStr = "\\.";
        //String regStr = "\\d\\d\\d";
        String regStr = "\\d{3}";
        Pattern pattern = Pattern.compile(regStr);    // 获得Pattern
        Matcher matcher = pattern.matcher(content);   // 获得matcher

        while (matcher.find()) {                      // 打印matcher获取每一个字符串,调用一次find找到一个
            System.out.println("找到 " + matcher.group(0));   
        }
    }
}

例子2 :

// 分组使用方法
public class RegExp07 {
    public static void main(String[] args) {

        String content = "hanshunping s7789 nn1189han";

        //下面就是非命名分组
        //说明
        // 1. matcher.group(0) 得到匹配到的字符串
        // 2. matcher.group(1) 得到匹配到的字符串的第1个分组内容
        // 3. matcher.group(2) 得到匹配到的字符串的第2个分组内容

        //String regStr = "(\\d\\d)(\\d\\d)";//匹配4个数字的字符串

        //命名分组: 即可以给分组取名
        String regStr = "(?\\d\\d)(?\\d\\d)";//匹配4个数字的字符串

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            System.out.println("找到=" + matcher.group(0));
            System.out.println("第1个分组内容=" + matcher.group(1));
            System.out.println("第1个分组内容[通过组名]=" + matcher.group("g1"));
            System.out.println("第2个分组内容=" + matcher.group(2));
            System.out.println("第2个分组内容[通过组名]=" + matcher.group("g2"));

        }
    }
}

4. 正则表达式与String类

在String类中集成了正则表达式,有以下两个接口
1.替换字符串中 符合regex模式的子串

public String replaceAll(String regex,String replacement)

2.整体匹配,看从开始到结束的这个串,符不符合模式的规定

public boolean matches(String regex){}

栗子:

public class StringReg {

    public static void main(String[] args) {
        String content = "2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,几周后其" +
                "获得了Apple公司Mac OS X的工业标准的支持。2001年9月24日,J2EE1.3发" +
                "布。" +
                "2002年2月26日,J2SE1.4发布。自此Java的计算能力有了大幅提升";

        //使用正则表达式方式,将 JDK1.3 和 JDK1.4 替换成JDK
        content = content.replaceAll("JDK1\\.3|JDK1\\.4", "JDK");
        System.out.println(content);

        //要求 验证一个 手机号, 要求必须是以138 139 开头的
        content = "13888889999";
        if (content.matches("1(38|39)\\d{8}")) {
            System.out.println("验证成功");
        } else {
            System.out.println("验证失败");
        }


        //要求按照 # 或者 - 或者 ~ 或者 数字 来分割
        System.out.println("===================");
        content = "hello#abc-jack12smith~北京";
        String[] split = content.split("#|-|~|\\d+");
        for (String s : split) {
            System.out.println(s);
        }

    }
}

5 分组,捕获,反向匹配(难点)

前面讲过使用()进行分组(将一个字符串分成多个子字符串),那么我想在正则表达式中使用前面分组匹配到的字符怎么办呢?
当然是使用反向匹配了,内部引用使用"\"分组号,外部引用使用$分组号。

举例:

public class RegExp13 {
    public static void main(String[] args) {
        String content = "我....我要....学学学学....编程java!";

        //1. 去掉所有的.

        Pattern pattern = Pattern.compile("\\.");
        Matcher matcher = pattern.matcher(content);
        content = matcher.replaceAll("");

 //       System.out.println("content=" + content);

        //2. 去掉重复的字  我我要学学学学编程java!
        // 思路
        //(1) 使用 (.)\\1+
        //(2) 使用 反向引用$1 来替换匹配到的内容
        // 注意:因为正则表达式变化,所以需要重置 matcher
//        pattern = Pattern.compile("(.)\\1+");//分组的捕获内容记录到$1
//        matcher = pattern.matcher(content);
//        while (matcher.find()) {
//            System.out.println("找到=" + matcher.group(0));
//        }
//
//        //使用 反向引用$1 来替换匹配到的内容
//        content = matcher.replaceAll("$1");
//        System.out.println("content=" + content);

        //3. 使用一条语句 去掉重复的字  我我要学学学学编程java!
        content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");

        System.out.println("content=" + content);

    }
}

以上内容根据韩顺平学java整理,视频课地址:
韩顺平学java

你可能感兴趣的:(JAVA,正则表达式,java)