* 字符集:
使用中括号括住字符串来创建字符集(character set),可以匹配它包括的任意字符串。
eg: ’[a-zA-Z0-9]‘ 能匹配任意大小写字母和数字。
eg: '[^abc]'可以匹配除了a、b和c之外的字符
* 子模式:
使用圆括号括起需要的部分,或称子模式(subparttern)
eg: 'p(ython|erl)'可以匹配'python'或'perl'
* 可选项和重复子模式:
在子模式后面加上问号,它就变成了可选项。
下面这些运算符允许子模式重复多次:
(pattern)* : 允许模式重复0次或多次;
(pattern)+ : 允许模式重复1次或n次;
(pattern){m,n} : 允许模式重复m~n次。
* 贪婪模式和勉强模式:
>>Greedy(贪婪模式): 数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。
如果你发现表达式匹配的结果与预期的不符,很有可能是因为——你以为表达式只会匹配前面几个字符,而实际上它是贪婪
模式,所以会一直匹配下去。
>>Relucant(勉强模式): 用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
贪婪模式 | 勉强模式 | 说明 |
X? | X?? | X表达式出现零次或一次 |
X* | X*? | X表达式出现零次或多次 |
X+ | X+? | X表达式出现一次或多次 |
X{n} | X{n}? | X表达式出现n次 |
X{n,} | X{n,}? | X表达式最少出现n次 |
X{n,m} | X{n,m}? | X表达式最少出现n次,最多出现m次 |
关于贪婪模式和勉强模式的对比,看如下代码:
String str = "hello , java!";
System.out.println(str.replaceFirst("\\w*", "#")); //输出 # , java!
//使用勉强模式,数量表示符(*)会尽量匹配最少字符,即匹配0个字符。
System.out.println(str.replaceFirst("\\w*?", "#")); //输出 #hello , java!