正则表达式字符串

文章目录


前言

正则表达式字符串(简称 "正则字符串"),就是用 Java 字符串格式书写的「正则表达式」------ 它是一串具有特殊语法规则的文本,用来描述、匹配一组符合特定规律的字符串,本质是 "字符串的匹配模板"。


一、正则表达式 vs 正则表达式字符串

很多新手会混淆这两个概念,小编先帮你区分清楚:

  • 正则表达式(Regex):是一套跨语言的匹配规则 / 语法(比如 \d{11}、\w+@\w+.\w+),不管是 Java、Python、JavaScript 都支持这套核心语法。

  • 正则表达式字符串:是某一种语言中,用来表示正则表达式的字符串形式(比如 Java 中要写 \d{11},对应核心正则 \d{11})。因为不同语言对 "转义字符" 的处理不同,所以正则表达式在不同语言中,会以不同的字符串形式呈现(Java 中需要双重转义是关键)。

简单说:正则表达式字符串 = 适配 Java 语法的正则表达式(用 Java 字符串包裹,处理好转义)。


二、元字符

正则字符串之所以能 "匹配一组字符串",是因为它包含了元字符(具有特殊含义的字符),而不是普通的字面量字符串。比如 \d 不是表示字符 \ 和 d,而是表示 "任意单个数字"。

我们可以把正则字符串的字符分为两类:

  1. 字面量字符(无特殊含义,匹配自身)
    就是普通的字符,用来匹配字符串中完全相同的字符,比如 a、1、@、中文 等。
    示例:正则字符串 "abc",只能匹配字符串 "abc",无法匹配 "abd"、"aabc"。
  2. 元字符(有特殊含义,是正则的核心)
    这是正则字符串的灵魂,常用元字符我们之前已经提过,这里再做详细解释,结合 Java 正则字符串示例:
正则元字符(核心语法) Java正则字符串(转义后) 含义说明 匹配示例
\d "\\d" 匹配单个数字(0-9) 匹配 0、5,不匹配 a、@
\w "\\w" 匹配单个字母、数字、下划线 匹配 A、3、_,不匹配 @、空格
. "." 匹配任意单个字符(除换行符) 匹配 a、1、@,不匹配 \n(换行)
* "*" 匹配前面的字符 0 次或多次) 正则 "a*" 可匹配 ""、"a"、"aaa"
+ "+" 匹配前面的字符 1 次或多次 正则 "a+" 可匹配 "a"、"aaa",不匹配 ""
{n} 直接写 "{n}" 即可 匹配前面的字符恰好 n 次 正则 "\d{11}" 匹配 11 位数字
{n,m} "{n,m}" 匹配前面的字符 n 到 m 次 正则 "a{2,4}" 匹配 "aa"、"aaa"、"aaaa"
^ "^" 匹配字符串的开头 正则 "^abc" 匹配 "abcde",不匹配 "xabc"
$ "$" 匹配字符串的结尾 正则 "abc$" 匹配 "xabc",不匹配 "abcde"
\ "\\"(匹配自身 \) 转义符,把元字符转为字面量 正则 "\." 匹配小数点 .,不匹配任意字符

三、双重转义

这是 Java 正则字符串的核心特点,也是和纯正则表达式的最大区别,必须重点掌握:

  • 原因:Java 字符串中,\ 是自身的转义字符(用来表示特殊字符,比如 \n 表示换行、" 表示双引号)。而正则表达式中,\ 也是正则的转义字符(比如 \d 表示数字、. 表示小数点)。
  • 结果:要在 Java 正则字符串中表示 "正则的转义符 \",必须先转义 Java 字符串自身的 \,也就是写成 \------ 这就是双重转义。

举个最经典的例子:

  1. 我们想要的正则表达式(核心语法):\d{11}(匹配 11 位数字)
  2. 转换为 Java 正则字符串:"\d{11}"(\d 转为 \d,{11} 是字面量,无需转义)

再举个例子(匹配小数点):

  1. 核心正则:.(把元字符 . 转义为字面量小数点)

  2. Java 正则字符串:"\."(先转义 Java 的 \ 为 \,再跟 .)


四、实战使用场景

正则字符串在 Java 中,主要用于 String 类的 3 个方法:matches()(完全匹配)、split()(分割字符串)、replaceAll()(替换字符串),这里举两个常用场景:

示例 1:用正则字符串校验手机号(matches())

java 复制代码
public class RegexStringDemo {
    public static void main(String[] args) {
        // Java 正则字符串:匹配 11 位数字(对应核心正则 \d{11})
        String phoneRegex = "\\d{11}";
        
        // 测试字符串
        String phone1 = "13800138000";
        String phone2 = "12345";
        
        // 匹配判断
        System.out.println(phone1.matches(phoneRegex)); // true(完全匹配)
        System.out.println(phone2.matches(phoneRegex)); // false(长度不足)
    }
}

示例 2:用正则字符串分割复杂字符串(split())

java 复制代码
public class RegexSplitDemo {
    public static void main(String[] args) {
        // 原始字符串:用逗号、空格、分号混合分割
        String str = "Java,Python  C;JavaScript";
        
        // Java 正则字符串:匹配 逗号、空格、分号 中的任意一个([] 表示匹配其中任意一个字符)
        String splitRegex = "[, ;]";
        
        // 分割字符串
        String[] result = str.split(splitRegex);
        
        // 输出结果
        for (String s : result) {
            System.out.println(s); // 依次输出:Java、Python、C、JavaScript
        }
    }
}

String splitRegex = "[, ;]" 这个正则字符串的含义:这个正则字符串表示「匹配 逗号(,)、空格( )、分号(;)中的任意一个字符」,常用来作为 split() 方法的参数,实现 "按这三种字符中的任意一种分割字符串"。

  1. 外层的 []:这是正则表达式中的「字符集」(也叫字符类),核心含义是 "匹配括号内的任意一个单个字符" ,注意是 "单个",且 "二选一 / 三选一"(括号里有几个字符就几选一)。

    比如 [abc] 表示匹配 a、b、c 中的任意一个单个字符;

    这里的 [, ;] 就是匹配 ,(逗号) 、(空格)、;(分号) 中的任意一个单个字符。

  2. 内层的 , ;:这三个都是「字面量字符」(无特殊正则含义),直接表示它们自身:

相关推荐
LYS_06182 小时前
寒假学习(14)(HAL库5)
java·linux·学习
qq_336313932 小时前
javaweb-maven单元测试
java·开发语言·maven
消失的旧时光-19432 小时前
第十三课实战版:权限系统实战:RBAC + Spring Security 从 0 到可用(含核心代码)
java·架构·rbac
Jaxson Lin2 小时前
Java编程进阶:智能仿真无人机项目4.0
java·开发语言·无人机
Remember_9932 小时前
MySQL 索引详解:从原理到实战优化
java·数据库·mysql·spring·http·adb·面试
上海合宙LuatOS2 小时前
LuatOS ——Modbus RTU 通信模式
java·linux·服务器·开发语言·网络·嵌入式硬件·物联网
野生技术架构师2 小时前
Java 21虚拟线程 vs Kotlin协程:高并发编程模型的终极对决与选型思考
java·开发语言·kotlin
Vivienne_ChenW2 小时前
DDD领域模型在项目中的实战
java·开发语言·后端·设计模式
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案(续)
java·数据库·人工智能·spring boot·架构·领域驱动