正则表达式

正则表达式是对字符串执行模式匹配的技术。

正则表达式匹配流程

private void RegTheory() {
        // 正则表达式
        String content = "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2) " +
                "的3个版本: J2ME (Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境: J2SE (Java  " +
                "Standard Edition,Java 2平台的标准版),应用于桌面环境:2EE (Java 2Enterprise Edition,Java " +
                "2平台的企业版) ,应用3443于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及9889";
        // 目标 匹配所有数组的字符串
        // 1、 \\d表示一个任意的数字
        String regStr = "\\d\\d\\d\\d";
        // 2、创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        // 3、创建匹配器
        // 说明,创建匹配器,按照正则表达式的规则去匹配
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()){
            Log.i(TAG,"找到:" + matcher.group(0));
        }
    }
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:1998
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:1999
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:3443
2023-08-08 16:09:28.168 29172-29172/cn.jj.reg I/JJWorld.MainActivity: 找到:9889
private void RegTheory() {
        // 正则表达式
        String content = "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2) " +
                "的3个版本: J2ME (Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境: J2SE (Java  " +
                "Standard Edition,Java 2平台的标准版),应用于桌面环境:2EE (Java 2Enterprise Edition,Java " +
                "2平台的企业版) ,应用3443于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及9889";
        // 目标 匹配所有数组的字符串
        // 1、 \\d表示一个任意的数字
        String regStr = "(\\d\\d)(\\d\\d)";
        // 2、创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        // 3、创建匹配器
        // 说明,创建匹配器,按照正则表达式的规则去匹配
        Matcher matcher = pattern.matcher(content);

        /**
         * matcher.find()
         * 1、根据指定的规则,定位满足规则的子字符串(比如1998)
         * 2、找到后,将 子字符串的开始的索引记录到 matcher对象的属性 int[] groups[0] = 0
         *      把该子字符串的结束的索引+1的值记录到 groups[1] = 4
         *
         * 3、如果再次指向 find方法。仍然安上面分析来执行
         *
         * matcher.find()  考虑分组
         * // 正则表达式中,包括小括号则表示分组
         * 第一个小括号表示第一组 第二个小括号表示第二组  (\d\d)(\d\d)
         *
         * 1、根据指定的规则,定位满足规则的子字符串(比如1998)
         * 2、找到后,将 子字符串的开始的索引记录到 matcher对象的属性 int[] groups;
         *      2.1 groups[0] = 0 ,把该子字符的结束的索引+1的值记录到 groups[1] = 4
         *      2.2 记录1组()匹配到的字符串 groups[2] = 0 groups[3] = 2
         *      2.3 记录2组()匹配到的字符串 groups[4] = 2 groups[5] = 4
         *      2.4 如果有更多的分组,依次类推
         *
         * 3、如果再次指向 find方法。仍然安上面分析来执行
         */
        while (matcher.find()){
            Log.i(TAG,"找到:" + matcher.group(0));
        }
    }

正则表达式语法

如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:

1、限定符
2、选择匹配符
3、分组组合和反向引用符
4、特殊字符
5、字符匹配符
6、定位符

转义符说明

元字符(Metacharacter)-转义号 \\

符号说明:

在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。

案例: 用java正则匹配多次匹配 java 匹配正则表达式_Java("

用( 去匹配 “abc$(”会怎样 ?

java正则匹配多次匹配 java 匹配正则表达式_Java_02

private void RegTest2() {
        String content ="abc$(abc(1.23(";
        //匹配(
//        String regStr = "\\(";
        String regStr = "\\.";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            Log.i(TAG,"match:" + matcher.group(0));
        }
    }

元字符-字符匹配符

java正则匹配多次匹配 java 匹配正则表达式_java正则匹配多次匹配_03


java正则匹配多次匹配 java 匹配正则表达式_java正则匹配多次匹配_04

更正:\\w 匹配单个数字、大小写字母字符以及下划线_ 相当于[0-9a-zA-Z_]
?表示0或者1
{3}表示三个数字
+代表1到多个
\\s 匹配任何空白字符(空格,制表符等
\\S 匹配任何非空字符
. 匹配出\n 之外的所有字符,如果要匹配。本身则需要使用\\.。

限定符

java正则匹配多次匹配 java 匹配正则表达式_Java_05


java正则匹配多次匹配 java 匹配正则表达式_android_06

private void regSMatching(){
        String content = "1111222 z_*@ hello jj 曙光";
        String regStr = "\\d{3,4}"; // 匹配任何非空字符
        Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            Log.i(TAG,"matcher:" + matcher.group(0));
        }
    }

java匹配时贪婪匹配,默认匹配多的。

2023-08-16 20:45:38.948 9275-10989/cn.jj.reg I/JJWorld.MainActivity: matcher:1111
2023-08-16 20:45:38.948 9275-10989/cn.jj.reg I/JJWorld.MainActivity: matcher:222

不区分大小写

修改字符串

(?i) 表示不区分大小写 示例:String regStr = “(?i)abc”;

修改生成Pattern规则

Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);

定位符

java正则匹配多次匹配 java 匹配正则表达式_java_07

\- 表示需要有-

public static void regT(){
        String content = "abc123-abc123";
//        String regStr = "[0-9]+[a-z]*";
        String regStr = "[0-9]+\\-[a-z]+";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        if (matcher.find()){
            Log.i(TAG,"reg:" + matcher.group(0));
        }
    }
2023-08-17 20:01:29.666 26962-27135/cn.jj.reg I/JJWorld.MainActivity: reg:123-abc
public static void regT(){
        String content = "abc123aabcdabcd 123 abcd assa";
//        String regStr = "[0-9]+[a-z]*";
//        String regStr = "[0-9]+\\-[a-z]+";
        String regStr = "abc\\B";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            Log.i(TAG,"reg:" + matcher.group(0));
        }
    }
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc
2023-08-17 20:14:10.771 29568-29740/cn.jj.reg I/JJWorld.MainActivity: reg:abc

\s

\s是一个特殊的转义字符,表示匹配任意的空白字符,包括空格、制表符、换行符等。

分组 重要

java正则匹配多次匹配 java 匹配正则表达式_Java_08

public void regGroup(){
        String content = "hanshunping s7789 nn1189han";
        String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            Log.i(TAG,"reg:" + matcher.group(0) + "-" + matcher.group(1) + "-" + matcher.group(2) + " g1 " + matcher.group("g1"));
        }
    }
2023-08-17 20:44:46.911 31878-32267/cn.jj.reg I/JJWorld.MainActivity: reg:7789-77-89 g1 77
2023-08-17 20:44:46.911 31878-32267/cn.jj.reg I/JJWorld.MainActivity: reg:1189-11-89 g1 11