Java 正则表达式详解:从基础语法到实战验证

Java 正则表达式:从基础到实战解析

正则表达式(Regular Expression)是处理字符串的强大工具,它通过预定义的模式匹配字符串,实现校验、查找、替换、切割等操作。在 Java 中,String 类的 matches()replaceAll()split() 等方法均支持正则表达式,配合 java.util.regex 包可实现复杂字符串处理。本文将从基础语法到实战案例,全面解析 Java 正则表达式的用法。

一、正则表达式基础:核心概念与作用

1. 什么是正则表达式?

正则表达式是由一系列字符和特殊符号组成的 “模式字符串”,用于描述字符串的格式规则。例如,用 [1-9]\\d{5,19} 可匹配 6-20 位的 QQ 号(首位非 0,其余为数字)。

2. 核心作用

  • 校验字符串格式:如验证手机号、邮箱、身份证号等是否符合规则。
  • 查找 / 替换字符串:在文本中定位符合规则的子串,或按规则替换内容。
  • 切割字符串:按正则模式拆分字符串(比固定字符切割更灵活)。

3. Java 中的正则入口

String 类的 matches(String regex) 方法是最基础的应用,用于判断字符串是否完全匹配正则模式(注意:是完全匹配,而非部分包含)。

二、正则表达式核心语法:字符、量词与分组

1. 字符类:匹配单个字符

通过 [] 定义一组可匹配的字符,仅匹配一个字符

语法含义示例
[abc]匹配 a、b、c 中的任意一个字符[abc] 匹配 "a"、"b"
[^abc]匹配除 a、b、c 外的任意字符(^ 表示取反)[^abc] 匹配 "d"、"1"
[a-zA-Z]匹配任意大小写字母[a-zA-Z] 匹配 "A"、"b"
[a-d[m-p]]匹配 a-d 或 m-p 中的字符(并集)等价于 [a-dm-p]
[a-z&&[^bc]]匹配 a-z 中除 b、c 外的字符(交集)等价于 [ad-z]

2. 预定义字符:简化常用字符类

为简化常见字符匹配,正则提供预定义字符(均匹配一个字符):

预定义字符含义等价字符类
.匹配任意字符(除换行符 \n-
\d匹配数字(0-9)[0-9]
\D匹配非数字[^0-9]
\s匹配空白字符(空格、制表符 \t、换行 \n 等)[\t\n\x0b\f\r ]
\S匹配非空白字符[^\s]
\w匹配字母、数字、下划线[a-zA-Z0-9_]
\W匹配非字母、数字、下划线[^\w]

注意:在 Java 字符串中,\ 需转义为 \\,因此正则中的 \d 在代码中需写为 \\d

3. 数量词:匹配多个字符

用于指定前面的字符 / 子模式重复的次数(默认贪婪匹配,即尽可能多匹配)。

数量词含义示例
X?X 出现 0 次或 1 次a? 匹配 ""、"a"
X*X 出现 0 次或多次a* 匹配 ""、"a"、"aa"
X+X 出现 1 次或多次a+ 匹配 "a"、"aa"
X{n}X 恰好出现 n 次a{2} 匹配 "aa"
X{n,}X 至少出现 n 次a{2,} 匹配 "aa"、"aaa"
X{n,m}X 出现 n 到 m 次(含 n 和 m)a{2,3} 匹配 "aa"、"aaa"

4. 分组:复用子模式

用 () 将部分正则括起来作为 “分组”,可实现子模式复用或批量操作。

  • 捕获分组:分组后可通过 \\组号(正则内部)或 $组号(正则外部,如替换时)复用分组内容。

    • 组号从 1 开始,按左括号顺序编号。
    • 示例:判断字符串首尾字符是否相同(如 "a123a"):
      String regex = "(.).+\\1"; // (.) 为第1组,\\1 复用第1组内容
      System.out.println("a123a".matches(regex)); // true

  • 非捕获分组:仅用于分组,无需复用,格式为 (?:正则)(?=正则) 等(较少用)。

三、正则表达式在字符串中的应用

1. 校验:String.matches(String regex)

判断字符串是否完全匹配正则模式(常用作格式校验)。

示例:验证 QQ 号(6-20 位,首位非 0,全数字):

public static void checkQQ(String qqNum) {
    // [1-9]:首位非0;\\d{5,19}:后面5-19位数字(总长度6-20)
    boolean isValid = qqNum.matches("[1-9]\\d{5,19}");
    System.out.println(isValid ? "QQ号格式正确" : "QQ号格式错误");
}

 替换:String.replaceAll(String regex, String newStr)

按正则模式匹配子串,并用 newStr 替换(替换所有匹配项)。

示例:去重连续重复字符(如 "我想玩玩三角角角洲洲洲" → "我想玩三角洲"):

    public static void outUseGrouping(){
        //需求:
        //将字符串:我想玩三角角角角角角角洲洲州州洲洲洲
        //替换为:我想玩三角洲

        //(.)表示把重复的内容的第一个字符看做一组
        // \\1表示第一个字符再次出现
        // + 至少一次
        // $1 表示把正则表达式中的第一组的内容,再拿出来用
        String str="我想玩玩三角角角角角角角洲洲洲洲洲洲";
        String result=str.replaceAll("(.)\\1+","$1");
        System.out.println(result);
    }

 切割:String.split(String regex)

按正则模式拆分字符串,返回字符串数组。

示例:按任意空白字符切割文本

    public static void StringUseRegex() {
        //有一段字符串:Mr.Rabbit always angry with Ms.watermelon
        //要求1:把字符串中的Mr.Rabbit 和Ms.Watermelon中间的字母换成love
        //要求2:把字符串中的Mr.Rabbit和Ms.Watermelon切割出来

        //1.
        //细节:
        //方法在底层会跟之前一样也会创建文本解析器的对象
        //然后从头开始去读取字符串中的内容,只要有满足的,那么久用第二个参数去替换
        String text="兔子先生alwaysangrywith西瓜小姐";
        String result=text.replaceAll("[\\w&&[^_]]+","LOVE");
        System.out.println(result);

        //2.
        String[] result2=text.split("[\\w&&[^_]]+");
        for (int i = 0; i < result2.length; i++) {
            System.out.println(result2[i]);
        }

    }

四、实战案例:常见格式验证

1. 验证手机号

规则:11 位数字,首位为 1,第二位为 3-9,后 9 位为任意数字。

String regex = "1[3-9]\\d{9}";
String[] phones = {"13112345678", "13712345667", "139456790271"};
for (String phone : phones) {
    System.out.println(phone + ":" + phone.matches(regex)); 
    // 输出:true、true、false(最后一个12位)
}

2. 验证邮箱

规则:用户名(字母、数字、下划线)+ @ + 域名(2-6 位字母 / 数字)+ . + 后缀(2-3 位字母,可多个后缀如 .com.cn)。

String regex = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
String[] emails = {"32332323@qq.com", "zhangsan@itcast.cn", "dlei0009@pci.com.cn"};
for (String email : emails) {
    System.out.println(email + ":" + email.matches(regex)); // 均为true
}

3. 验证身份证号(简单版)

规则:18 位,前 17 位为数字,最后一位为数字或 X(大小写均可)。

String regex = "\\d{17}[0-9xX]";
String idCard = "420106199001011234";
System.out.println(idCard.matches(regex)); // true

4. 验证用户名

规则:由字母、数字、下划线组成,长度 4-16 位。

String regex = "\\w{4,16}";
String username = "java_coder";
System.out.println(username.matches(regex)); // true(长度8,符合规则)

五、正则表达式编写技巧

  1. 从正确案例出发:先分析合法字符串的格式(如手机号 “13112345678”→ 首位 1,第二位 3-9,后 9 位数字),逐步拆解规则。
  2. 分步验证:复杂正则可拆分为多个子规则,逐步拼接(如邮箱 = 用户名 + @ + 域名 + 后缀)。
  3. 利用工具辅助:可使用 IDE 插件(如 AnyRule)或在线正则工具(如 regex101.com)测试正则模式。
  4. 注意转义字符:Java 中需用 \\ 表示正则中的 \(如 \d → \\d)。

六、总结

正则表达式是处理字符串的 “瑞士军刀”,掌握其语法可大幅提升字符串处理效率。本文核心要点:

  • 字符类([])和预定义字符(\d\s 等)用于匹配单个字符;
  • 数量词(*+{n,m} 等)控制字符重复次数;
  • 分组(())实现子模式复用,支持复杂匹配;
  • 结合 matches()replaceAll()split() 可实现校验、替换、切割等操作。

在实际开发中,正则表达式常用于表单验证、日志解析、文本清洗等场景,灵活运用可简化大量字符串处理代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值