Quantifiers 量词
指定匹配出现的次数。注:1)() 一组字符,并且关系;2){} 量词,出现次数;3)[]一组字符,或关系
X?不匹配或一次匹配;
X+一次匹配或多次匹配;
X* 不匹配或多次匹配;
X{n}匹配n次
X{n,}匹配至少n次,无上限
X{n,m}匹配至少n次,但不超过m次
例如:
表达式:a?字符串:(空串)find返回true
表达式:(foo)+字符串:foofind返回true
表达式:(foo)*字符串:(空串)find返回true
表达式:a{3,} 字符串:bbaaaaccc find返回true,group是aaaa
表达式:a{3,4}字符串:bbaaaaacccfind返回true,group是aaaa;因为匹配次数需要满足至少3次,但不超过4次,所以匹配aaaa。
Greedy、Reluctant、Possessive量词的区别
Greedy 顾名思义贪婪,一次读入所有字符尝试第一次匹配。如果第一次匹配失败,则退后一个字符继续匹配,直到匹配成功,或者没有可以继续退后的字符停止。不加任何额外量词,以上例子默认就是Greedy量词。
Reluctant 和Greedy正相反。从开始一次读入一个字符进行匹配,直到最后匹配所有字符。后面加?量词修饰。
Possessive 和Greedy一样一次读入所有字符尝试匹配,但区别是只匹配一次,也是唯一的一次。不会像Greedy一样退后字符进行尝试匹配。后面加+量词修饰。
例如:
字符串:xfooxxxxxxfoo
1、表达式:.*foo(Greedy)find返回true,group是xfooxxxxxxfoo。
全部读入字符串;先匹配.*,全部匹配成功;接着匹配foo,逐字符退后读入字符匹配。
2、表达式:.*?foo(Reluctant)
find第一次返回true,group是xfoo;
find第二次返回true,group是xxxxxxfoo。
逐字符读入匹配正则表达式。
3、表达式:.*+foo(Possessive)find返回false
全部读入字符串;先匹配.*,全部匹配成功;接着匹配foo,因为所有字符已经匹配并且没有退后匹配机制,所以匹配不成功
Capturing Groups
- Capturing Groups就是把多个字符作为一个单元,把多个字符放在一对()内。
例如:
表达式:hi(hello)+(df)* 字符串:hihellohellodf
Capturing Groups的数量就是判断表达式一共有多少对()。其中组序号是从左向右进行划分,即:第1组(hello),第2组(df)。还有一个特殊的第0组,就是表达式本身hi(hello)+(df)*。
Matcher.groupCount()返回Capturing Groups的数量(不包括第0组)。因此上述例子的返回值是2。
Matcher.group(group)返回匹配成功的第group组字符串。
Matcher.group(0)同Matcher.group()返回hihellohellodf;
Matcher.group(1)返回hello;
Matcher.group(2)返回df;
注意:若匹配成功,某一组没有子序列的话,返回null。
- BackreferencesN后跟组号N,就是重复匹配第N组子序列。
例如:
表达式:(dd)1
1、字符串:1212find返回true,group是1212。
(dd)表示匹配子序列12,1重复匹配第一组子序列12。
2、字符串:1234find返回false。
(dd)表示匹配子序列12,1重复匹配第一组子序列12,后面的两个数字是34,所以不匹配。
Boundary Matchers 边界匹配
^ 起始限制,必须在行首
$ 结尾限制,必须在行尾
例如:
表达式:^88.* 字符串:88afind返回true。88在行首,后面是0到多个字符。
表达式:s*dog$ 字符串: dog(前面3个空字符)find返回true。dog在行尾,前面是0到多个whitespace字符。
b 限制word边界
B 不限制word边界
例如:
表达式:bdogb字符串:hello dogfind返回true,group是dog。查找dog,前后边界约束,不得有whitespace意外的字符。
表达式:Bdogb字符串:hellodog ccfind返回true,group是dog。查找dog,前边界不约束,因为有B,后边界约束。
A相当于^
Z 相当于$,最后的终止符(如:)不在匹配之列
z匹配最后的所有字符
例如:
表达式:Adog字符串:dog hellofind返回true。
表达式:dogZ字符串:abc dog find返回true。以dog结尾(不匹配终止符)。
表达式:dogz字符串:abc dog find返回false。字符串是以结尾,最后不是以dog结尾,所以不匹配。
G紧接着上一次匹配的后面进行匹配,直到不匹配为止。
例如:
表达式:Gdog字符串:dogdog dog
find第一次返回true,group是dog,start是0,end是3;
find第二次返回true,group是dog,start是3,end是6。
首先匹配第一个dog,然后紧接着上一次匹配的后面匹配第二个dog;第二个dog后面是空格,所以匹配结束,即使空格后面还有一个dog。使用场景:匹配多个相同子序列之间无其他字符干扰。