基本格式
- 创建正则对象(正则表达式对象)
- 创建匹配器()
- \\d 代表 0-9的数字
String regStr = "\\d";
//正则表达式
Pattern pattern = Pattern.compile(regStr);
//创建模式对象(正则表达式对象)
Matcher matcher = pattern.matcher(content);
//创建匹配器matcher 按照正则表达式的规则去匹配 content字符串
while(matcher.find())
{
System.out.println(matcher.group(0));
}
matcher.find()
完成的任务
- 根据设定的字符串,定位满足规则的字符串(比如1998)
- 找到后将 字字符串的 开始索引记录 到matcher对象中 的属性 int[] group数组(数组初始化是-1)中
- groups[0] 存放着满足规则字符串的起始值,groups[1] 存放着满足规则字符串的结尾值+1
- 记录oldlast值 将子字符串的结束的索引+1 下一次开始find匹配从这里开始
matcher.group(0)完成的任务
当执行时
- 根据 groups[0] - groups[1] 记录的位置,从content开始截取字符串返回
- 返回[0,4) substring截取是左闭右开区间 包含0 但不包含索引为4的值
group(i)方法中
i代表的是当前这一次正则结果,分组i的值,某个正则中,0代表整个正则结果,j一个括号为一组,
若传入的0 则输出的是整个字符串 起始(i * 2) 结束(i * 2 + 1) 得到是0和1(第一组)
若传入的是1则输出的是第2组字符串 还是上面的运算方法得到的是 2 和3 2 — 4和5
++因为要存两个值(头/尾+1)所以需要乘以2++
如果再次指向find方法,将会重新查找字符串 起始值groups[0]=下一次字符串开始索引位置 ,group[1]=下一次字符串结束的索引位置,一切的一切又是一样,只不过是覆盖了groups的下标0和1的空间
分组
正则表达式中出现括号则算一组,第二个括号则算第二组
"(\\d\\d)(\\d\\d)"
该字符串有两组,通过括号切割划分
重点在下面
比如字符串是1234
find查找整个的字符串,起始和终止存放在groups[0] = 0 至 groups[1] = 4为整个字符串的起始和终止
接下来查找第1组的字符串,存放在groups[2]-groups[3] 0,2 (取不到2)
接下来查找第2组的字符串,存放在groups[3]-groups[4] 2,4(取不到4)
若想要的group超出则报错误
正则表达式语法
必须了解元字符功能,元字符大致分为
限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符
元字符-转义符号 \\
Java 正则中 \\代表其他语言的一个\
若需要检索 特殊字符 需要在特殊字符前添加转义符号
java的正则表达式中,用两个反斜杠来代表转义符号,其他语言一般是一个反斜杠
特殊字符有 . * + () $ / \ ? [] ^ { }
比如说.
单独出现在正则表达式中意思是匹配所有字符(除了\n)
若使用\\.
则查找的是 点 本身
元字符-字符匹配符
[ABC]
匹配的是A、B、C中的任意字符
[^ABC]
匹配的是 除了A、B、C中其他任意字符
[A-Z]
匹配的是 所有大写的字符
.
匹配所有字符 (除了\n) A...B
匹配是 A*&(B
\\d
匹配单个 数字字符,相当于[0-9]
\\d\\d\\d
等价于\\d{3}
\\D
匹配的是 单个非数字字符 相当于[^0-9]
\\w
匹配单个 数字 大写小写字母(下划线) 字符
\\W
匹配非 单个 数字 大写小写字母(下划线) 字符
\\s
所有空白的字符 空格 制表符
\\S
所有++非++空白的字符 空格 制表符
不区分大小写的方法
(?i)abc
abc无论大小写都能匹配
a(?i)bc
a一定小写 bc无论大小写都能匹配
a((?i)b)c
只有b不区分大小写
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
选择匹配符
ab|黄
可以查找字符串中包含ab 和 黄
匹配限定符
细节,作用在前面最近的一个
java匹配默认贪婪匹配,尽量匹配多的
定位符
起始字符,代表整个字符串的起始字符,若起始字符不符合则为空($结束同理)
边界字符 空格处 结束处,为指定字符串
分组
下面是举例非命名分组,group的1/2就是两组各自的内容
命名分组,可设置组名
非捕获分组 特别分组
第一个是组装,将常量和变量组装匹配
第二个 匹配常量 但是需要后面条件成立的常量
第三个,与第二个相斥
非贪婪匹配
整体匹配matches ![在这里插入图片描述](https://img-blog.csdnimg.cn/5c5a12c9dbf1412294ce6a57c9a4a876.png)
Matcher类 常用方法
分组 捕获 反向引用
2. 捕获 看左括号起始,由此可判断出括号的顺序
3. 反向引用
用法 引用已经存在的分组 格式/内容 可以写出相同内容出现在不同的位置
比如说: 匹配五个连续的相同数字
‘(\d)\1{4}’ 在第一个分组的后面\1{4}代表内部引用第一组的值并且有四位
外部反向引用是使用美元符号 + 分组号 所以在replaceAll中使用 外部反向引用
String类本身就支持正则表达式
字符串的marches判断功能
是整体匹配!!!!!整个字符串必须符合正则的开头结尾
split分割也支持正则