1.字符类([]只能表示一个字符,不能表示多个,如[ab]表示ab中的一个而不是表示连起来的ab)
. 任意字符
[abc] a、b、c中的任意一个
[^abc] a、b、c之外的任意字符
[a-zA-Z] a到z或A到Z中的任意一个字符
[abc[hij]] 相当于[abchij]
[a-z&&[hij]] a-z与hij的交,hij中的一个
\s 空白(空格,tab,换行,换页,回车)
\S 非空白([^\s])
\d 数字0-9
\D 非数字[^0-9]
\w 词字符[a-zA-Z0-9]
\W 非词字符[^\w]
2.逻辑操作符
XY Y在X后面
X|Y X或Y
(X) 组,可以用group(int group)方法来获得相应的组,组号为0表示整个表达式,组号为1表示第一队括起来的组,依此类推
3.量词
? 0个或1个
+ 至少一个
* 0个或多个
X{n} 恰好n个X
X{n,} 至少n个X
X{n,m} n到m个X
4.匹配模式
有三种匹配模式:
(1)贪婪型
默认都是贪婪的,比如有字符串abcabc,当使用正则表达式(.*c)时只能匹配到abcabc,而不是abc
(2)勉强型
用?表示,加在量词后面。对于字符串abcabc,使用正则表达式(.*?c),?表示勉强型,表示匹配满足模式所需的最少字符,可以匹配到两个abc
(3)占有型
只在java中能用,防止回溯,用+表示,加在量词后面
5.用法
java中编写正则表达式要注意转义
(1)直接使用String类的matches()方法,效率较低
(2)先用Pattern.compile()方法编译正则表达式
Pattern p = Pattern.compile(regex)
接下来使用Pattern对象的matcher()方法,生成一个Matcher对象
Matcher m = p.matcher(input),input为字符串,可以为"",使用""可以为循环提供一定的性能优化,可以在创建Matcher对象后用reset()重置字符串
(3)matcher.find()可用来查找多个匹配,如可用
while(m.find()){
System.out.print(m.group());
}
来查找所有匹配的字符串。
matcher.find(i)表示从位置i开始匹配
(4)matcher.group(i)表示第i个分组,i从1开始,组号为0表示整个表达式,组号为1表示第一队括起来的组,依此类推
(5)start()表示起始位置的索引,end()表示最后字符的索引加1的值
start(i)表示分组i的起始位置的索引,end(i)表示分组i的最后字符的索引加1的值
(6)java String replaceAll()分组
用$表示分组,如temp = temp.replaceAll("/([A-Za-z])[A-Za-z]", "/$1");