正则表达式
是一种对字符串进行匹配、检索、和替换的一种规则
正则匹配数据的效果非常高、可读性很差
精确匹配
- xyz : 匹配字符串中的 xyz
元字符匹配
-
[xyz] : 匹配 x, y, z 中的任意一个字母
-
[a-z] : 匹配 a 到 z 之间的任意一个字母
-
[0-9] : 匹配 0 ~ 9 之间的任意一个数字
-
[.] 或者 . : 匹配一个 小数点
-
[^0-9] : 匹配非数字
-
\d : 匹配一个数字、等价于 [0-9]
-
\D : 匹配一个非数字、等价于 [^0-9]
-
\w : 匹配 字母、数字、下划线、等价于 [a-zA-Z0-9_]
-
\W : 对 \w 取反
-
[\D\d] : 匹配所有的任意一个字符
-
\s : 匹配空白字符(空格、制表符、换行符)
-
\S : 对 \s 取反
-
.
: 匹配除换行符之外的任意一个字符
多字符匹配
- X{n} : 匹配 n 个 X 匹配的内容
- X{n,} : 匹配至少 n个 X 匹配的内容
- X{n,m} : 匹配 n ~ m 个 X 匹配的内容, n <= m
X代表元字符匹配规则
贪婪式表达式
- X* : 匹配 0 ~ N 个 X 匹配的内容, 等价于 {0,}
- X+ : 匹配 1 ~ N 个 X 匹配的内容, 等价于 {1,}
- X? : 匹配 0 ~ 1 个 X 匹配的内容, 等价于 {0,1}
非贪婪式表达式
在贪婪式表达式的后面,添加一个 ? 就变成了 非贪婪式表达式
- X*? : 匹配 0 ~ N 个 X 匹配的内容
- X+? : 匹配 1 ~ N 个 X 匹配的内容
- X?? : 匹配 0 ~ 1 个 X 匹配的内容
非贪婪式表达式,一般需要和后面的表达式配合完成匹配
非贪婪式表达式 一般不会出现在正则的尾部
分组(regex)
对正则表达式使用小括号进行分组
作用 是用来将整个正则表达式匹配的内容中 具有价值或者关注的数据 进行单独分组标记、以便后续的数据提取
分组的顺序: 以左括号为主来标记组的顺序
命名捕获分组 (?<name>regex)
给组设置一个名称、方便程序根据名字获取组匹配的内容
?<name>
: 给组设置一个名称
不可的语言对他语法可能会不一样,例如 Python的语法式(?P<name>regex)
非捕获分组 (?:regex)
当使用 小括号的时候,正则表达式会产生分组效果,如果此时不希望小括号作为一个组,那么可以在括号里添加 ?:
引用分组 \n
n 代表 组的编号
通过 引用某一个组匹配的内容,来进行匹配
常用来解决对称匹配问题
选择 |
对一个整体进行 或运算
限定符
一般用来做数据校验,用来校验字符串是否匹配内容
^
: 以 … 开头, 位置写在正则表达式所有匹配规则的前面$
: 以 … 结尾, 位置写在正则表达式所有匹配规则的后面
断言
-
反向确定断言 (?<=)
-
反向否定断言 (?<!)
-
正向确定断言 (?=)
-
正向否定断言 (?!)
Java中使用正则表达式
- 在 Java 语言中,正则表达式使用 字符串 的形式 来表示
- 表示正则表达式的类是 java.util.regex.Pattern 类
将字符串格式的正则表达式转成Pattern对象
Pattern p = Pattern.compile(regex) ;
Matcher m = p.matcher(str)
m.matches() : 会自动在正则前后加上限定符^$, 用来匹配整个字符串,一般用来做数据校验
m.find() : 会根据正则表达式,从字符串中查找匹配的内容,如果找到,返回 true
m.group() : 会提取正则表达式 匹配的内容,但该方法在使用前 必须先调用 m.find()
matches()
会自动在正则前后加上限定符^$, 用来匹配整个字符串,一般用来做数据校验
find() + group()
会根据正则表达式,从字符串中查找匹配的内容,并获取匹配的容器
group(n)
n 如果是数字,则代表 提取 正则第 n 组 匹配的内容, 如果是 0, 代表获取正则匹配的内容
n 如果是字符串,则代表 命名捕获分组中定义的 组名
字符串替换
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
StringBuilder sb = new StringBuilder();
while (matcher.find()) {
matcher.appendReplacement(sb, 'xxxxx');
}
matcher.appendTail(sb);
其他方法
Pattern.matches(regex, str) : 校验字符串是否满足条件
字符串中支持正则表达式的方法
-
replaceAll(regex, newstr) : 将 regex匹配的内容全部替换成 newstr
-
replaceFirst(regex, newstr) : 将 regex第一次匹配的内容替换成 newstr
-
split(regex) : 按照正则表达式匹配的内容拆分字符串
-
split(regex, limit) : 按照正则表达式匹配的内容拆分字符串,拆分为limit长度的数组
- limit 为 0,则代表 全部拆分
-
matches(regex) : 验证字符串
正则修饰符
- S模式
在 dotAll 模式下,
.
匹配任意一个字符
- I 模式:
在正则表达式匹配内容的时候,忽略大小写
- M 模式
M模式要配合限定符才能使用