文章目录
前言
正则表达式字符串(简称 "正则字符串"),就是用 Java 字符串格式书写的「正则表达式」------ 它是一串具有特殊语法规则的文本,用来描述、匹配一组符合特定规律的字符串,本质是 "字符串的匹配模板"。
一、正则表达式 vs 正则表达式字符串
很多新手会混淆这两个概念,小编先帮你区分清楚:
-
正则表达式(Regex):是一套跨语言的匹配规则 / 语法(比如 \d{11}、\w+@\w+.\w+),不管是 Java、Python、JavaScript 都支持这套核心语法。
-
正则表达式字符串:是某一种语言中,用来表示正则表达式的字符串形式(比如 Java 中要写 \d{11},对应核心正则 \d{11})。因为不同语言对 "转义字符" 的处理不同,所以正则表达式在不同语言中,会以不同的字符串形式呈现(Java 中需要双重转义是关键)。
简单说:正则表达式字符串 = 适配 Java 语法的正则表达式(用 Java 字符串包裹,处理好转义)。
二、元字符
正则字符串之所以能 "匹配一组字符串",是因为它包含了元字符(具有特殊含义的字符),而不是普通的字面量字符串。比如 \d 不是表示字符 \ 和 d,而是表示 "任意单个数字"。
我们可以把正则字符串的字符分为两类:
- 字面量字符(无特殊含义,匹配自身)
就是普通的字符,用来匹配字符串中完全相同的字符,比如 a、1、@、中文 等。
示例:正则字符串 "abc",只能匹配字符串 "abc",无法匹配 "abd"、"aabc"。 - 元字符(有特殊含义,是正则的核心)
这是正则字符串的灵魂,常用元字符我们之前已经提过,这里再做详细解释,结合 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 字符串自身的 \,也就是写成 \------ 这就是双重转义。
举个最经典的例子:
- 我们想要的正则表达式(核心语法):\d{11}(匹配 11 位数字)
- 转换为 Java 正则字符串:"\d{11}"(\d 转为 \d,{11} 是字面量,无需转义)
再举个例子(匹配小数点):
-
核心正则:.(把元字符 . 转义为字面量小数点)
-
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() 方法的参数,实现 "按这三种字符中的任意一种分割字符串"。
-
外层的 []:这是正则表达式中的「字符集」(也叫字符类),核心含义是 "匹配括号内的任意一个单个字符" ,注意是 "单个",且 "二选一 / 三选一"(括号里有几个字符就几选一)。
比如 [abc] 表示匹配 a、b、c 中的任意一个单个字符;
这里的 [, ;] 就是匹配 ,(逗号) 、(空格)、;(分号) 中的任意一个单个字符。
-
内层的 , ;:这三个都是「字面量字符」(无特殊正则含义),直接表示它们自身: