B |
指定字符B |
xhh |
十六进制值为0xhh 的字符 |
uhhhh |
十六进制表现为0xhhhh 的Unicode字符 |
|
制表符Tab |
|
换行符 |
|
回车 |
f |
换页 |
e |
转义(Escape) |
表达式 | 含义 |
---|---|
. |
任意字符 |
[abc] |
包含a 、b 或c 的任何字符(和`a |
[^abc] |
除a 、b 和c 之外的任何字符(否定) |
[a-zA-Z] |
从a 到z 或从A 到Z 的任何字符(范围) |
[abc[hij]] |
a 、b 、c 、h 、i 、j 中的任意字符(与`a |
[a-z&&[hij]] |
任意h 、i 或j (交) |
s |
空白符(空格、tab、换行、换页、回车) |
S |
非空白符([^s] ) |
d |
数字([0-9] ) |
D |
非数字([^0-9] ) |
w |
词字符([a-zA-Z_0-9] ) |
W |
非词字符([^w] ) |
1. String.match(正则) 可以返回true或者false
2. String.split 可以将字符串从正则匹配的地方切开
3. String.replaceAll和replaceFirst 都可以使用正则
4. +代表一次或多次 ?代表0次或一次 *代表0次或多次
5. 第一个如果不加? 是贪婪模式 那么匹配到的就有两个group 加问号和第二个一样 第二个就是4个group
Matcher m1 = Pattern.compile("(abc)+?").matcher("abcabcabcdefabce") 匹配abc这个整体
Matcher m2 = Pattern.compile("abc+").matcher("abcabcabcdefabce"); 匹配abc c这个字符越多越好
6.Matcher.find 如果不传参数 就是每次返回true/false代表是否匹配上 如果传参数代表从字符串的某个下标开始匹配
Matcher.group 可以将匹配上的字符串取出来 Matcher.find 每次都会去匹配,所以一般的用法都是:
while(m.find()) System.out.print(m.group() + " ");
7.Group 组的概念 组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为 0 表示整个表达式,组号 1 表示被第一对括号括起来的组,以此类推。
A(B(C))D 这里有三个组 组 0 是 ABCD
,组 1 是 BC
,组 2 是 C
(ab)(c+)(w)? 这里有四个组 组0是ab(c)+(w)? 组1是ab 组2是c+ 组3是w
groupCount 可以查看组的个数 (如果有三个组会返回2)
group 上一次的匹配操作匹配上的数据 匹配第0组(全匹配)
group(int i ) 上一次的匹配操作匹配上的数据 匹配第i组 我理解是group(0)匹配上的 然后用当前组的内容再去匹配一次
Case1:Matcher m1 = Pattern.compile("((ab)(c+)(w)?)+").matcher("abcccabcabccdefabce");
这个case 如果group的结果是abcccabcabcc 但是最后是+ 匹配一次或多次 所以group1、2、3、4的时候是匹配最后一次的结果 也就是abcc
所以group1、2、3、4 分别对应 abcc ab cc null
第一次find的时候调用m1.start() = 0,m2.end() = 12 左闭右开("abcccabcabcc") start和end还可以传group 如果传group=1 那么start=8,end=12("abcc") 如果group = 3 那么start=10,end=12("cc")
8.Matcher调用的一些方法整理
- matches:整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False。但如果前部分匹配成功,将移动下次匹配的位置。
- lookingAt:部分匹配,总是从第一个字符进行匹配,匹配成功了不再继续匹配,匹配失败了,也不继续匹配。
- find:部分匹配,从当前位置开始匹配,找到一个匹配的子串,将移动下次匹配的位置。
- reset:给当前的Matcher对象配上个新的目标,目标是就该方法的参数;如果不给参数,reset会把Matcher设到当前字符串的开始处。