正则表达式
是专门对字符串进行 查找、提取、替换、校验 的一种 强大的 字符串 分析器 。
市面上几乎所有的编程语言都支持正则表达式 。
正则表达式 是由一些特殊 字符组成的
正则匹配规则
精确匹配
- xyz : 匹配 xyz (非正则中的特殊字符)
单字符匹配
- [xyz] : 匹配 x, y, z 中的任意一个字符
- [0-9] : 匹配任意一个数字
- [a-zA-Z] : 匹配任意一个字母
- [a-zA-Z0-9] : 匹配任意一个字母或数字
- [a-z0-9A-Z_] :匹配任意一个字母、数字、下划线(单词字母)
- [^a-z0-9A-Z_] : 匹配任意一个非单词字符
- [^0-9] : 匹配任意一个非数字
元字符匹配
-
\d : 匹配任意一个数字、等价于 [0-9]
-
\D : 匹配任意一个非数字、等价于 [^0-9]
-
\w : 匹配任意一个单词字符、等价于 [a-z0-9A-Z_]
-
\W : 匹配任意一个非单词字符、等价于 [^a-z0-9A-Z_]
-
\s : 匹配任意一个空白字符(空格、制表符、换行符)
-
\S : 匹配任意一个非空白字符
- \h : 匹配任意一个 空格 或者 制表符
- \t : 匹配任意一个 制表符
- \r\n : 匹配 window 环境下的 换行
- \n : 匹配 Linux 环境下的换行
-
.
: 除换行符以外的任意字符 -
. : 匹配一个点 (正则中的特殊字符有特殊含义,单如果要匹配特殊字符对应的字符,则需要转义)
多个字符匹配
- X{m} : 匹配 m 个 X
- X{m,} : 匹配至少 m 个 X
- X{m,n}: 匹配 至少 m个 X, 最多不超过 n 个 X
贪婪式匹配
- X? : 匹配 0 ~ 1 个 X , X{0, 1}
- X+ : 匹配至少 1 个 X , X{1,}
- X* : 匹配至少 0 个 X , X{0,}
尽可能多的匹配能够匹配的内容,让贪婪表达式 后面的表达式 尽可能 晚 的尝试匹配
非贪婪式匹配
表现上, 在贪婪式表达式的后面 添加 ? 形成 非贪婪式。
- X?? : 匹配 0 ~ 1 个 X , X{0, 1}
- X+? : 匹配至少 1 个 X , X{1,}
- X*? : 匹配至少 0 个 X , X{0,}
尽可能少的匹配能够匹配的内容,让非贪婪式 后面的表达式 尽可能 早 的完成匹配
分组
使用小括号,将一段正则 括起来,形成一个组
- 命名捕获分组
给一个组 设置一个名字, 语法 (?regex)
- 非命名捕获分组
让小括号 不在作为 组 , 语法 (?:regex)
- 引用分组
引用一个组匹配的内容, 语法 \n (n 代表组的序号)
选择 |
| 可以将2个正则进行拼接、匹配 2个正则 匹配的内容
限定符
- ^ : 以 … 开头, 必须出现在正则的头部
- $ : 以 … 结尾、 必须出现在正则的尾部
主要负责校验字符串
匹配中文
- [\u4e00-\u9fa5]
断言
(?=) : 正向确定断言
\w+(?=s) : 匹配 一个以 s 结尾的单词、且不包含 s
(?<=) : 反向确定断言
(?<=window)\d+ : 匹配 多个数字、且数字的前面 一定是 window
(?!) : 正向否定断言
(?<!) : 反向否定断言
Java 中 操作 正则表达式
正则表达式是由一组特殊字符组成的字符串、那么为了和 字符串的使用 进行区分, Java中提供了一个 Pattern 类。
Pattern 类 表示 模式 , 正则就是 一种模式 ,所以 Pattern 用来表示 Java中的正则。
Matcher 类 用来进行正则匹配、可以使用 查找、提取、替换等功能。
Pattern 类
-
Pattern.compile(regex) ; 将一个字符串格式的正则表达式 转成 Pattern 对象
-
Pattern.compile(regex, flags) : 将一个字符串格式的正则表达式 转成 Pattern 对象, 并设置正则修饰符
-
Pattern.matches(regex, str) : 使用正则 匹配 某一个字符串
Pattern 类 提供的成员方法
- matcher(str) : 传入要处理的字符串、返回一个正则匹配器
Matcher 类 提供的成员方法
-
find() : 查找 字符串中 是否 拥有 满足正则匹配的内容, 如果有,返回 true, find每次只能找到正则匹配的一个内容,如果需要找多个,多次调用 find
-
start() : 获取 正则 匹配的内容的其实位置, 先调用 find() 才可以使用,
-
start(group) : 获取 正则 第 group 组 子表达式 匹配的内容的 起始位置
-
start(groupName) : 获取 正则 组名为 groupName的 子表达式 匹配的内容的 起始位置
-
end() : 获取正则匹配的内容的 结束位置,用法和 start() 相同
-
group() : 用来提取正则匹配的内容, 用法和 start() 相同
-
matches() : 用来对字符串进行校验、会对正则自动添加 限定符
-
appendReplacement(sb, replacement) : 追加替换到 StringBuilder/StringBuffer中
-
appendTail(sb) : 将 字符串尾部的信息 拼接到 StringBuilder/StringBuffer中
// 做 字符串拼接
StringBuilder sb = new StringBuilder();
while (m.find()) {
// 获取 正则匹配的 第一组的 内容
//String key = m.group(1);
m.appendReplacement(sb, "?");
}
// 整个循环结束后,将 后面的内容拼接到 sb 中
m.appendTail(sb);
正则修饰符 Pattern类提供的静态常量
-
CASE_INSENSITIVE (i 模式) : 正则在进行匹配的时候 不区分大小写
-
DOTALL (点模式、s模式) : 正则中的
.
匹配任意字符(包含换行符) -
MULTILINE (m 模式): 多行匹配, 限定符可以匹配多行, 主要配合 ^$ 匹配多行~