正则表达式中的“通配符”又被称为预定义字符,它可以匹配多个字符的特殊字符。
表 1 预定义字符
预定义字符 |
说明 |
. |
可以匹配任何字符 |
\d |
匹配0~9的所有数字 |
\D |
匹配非数字 |
\s |
匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符 |
\S |
匹配所有的非空白字符 |
\w |
匹配所有的单词字符,包括0-9所有数字、26个英文字母和下划线 |
\W |
匹配所有的非单词字符 |
e\w可以匹配excel ,excellent,except,expert,extra等等字符
如果匹配电话号码86-\d\d\d\d\d\d\d\d\d\d\d
表 2方括号表达式
方括号表大叔 |
说 明 |
表示枚举 |
例如[abc],表示a、b、c其中任意一个字符 |
表示范围:- |
例如[a-f],表示a~f范围内的任意字符,[a-cx-z]b表示a~c、x~z范围内的任意字符 |
表示“与”&& |
[a-z&&[def]]求a~z和[def]的交集 |
表示“并”运算 |
并运算与前面的枚举类似。 |
正则表达式还支持圆括号表达式,用于将多个表达式组成一个表达式可以使用或运算符。正则表达式(public|protected|private)三个访问控制符其中之一。
边界匹配符 |
说明 |
^ |
行的开头 |
$ |
行的结尾 |
\b |
单词的边界 |
\B |
非单词的边界 |
\A |
输入的开头 |
\G |
前一个匹配的结尾 |
\Z |
输入的结尾,仅用于最后的结束符 |
\z |
输入的结尾 |
正则表达式还提供了数量标识符,正则表达式还提供了数量标识符,正则表达式支持的数量标识符有如下几种模式:
Greedy(贪婪模式):数量标识符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。
Reluctant(勉强模式):用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
Possessive(占有模式):用加号后缀(+)表示,目前只有Java支持占有模式
三种模式的数量表示符
贪婪模式 |
勉强模式 |
占有模式 |
说明 |
X? |
X?? |
X?+ |
X表达式出现零次或一次 |
X* |
X*? |
X*+ |
X表达式出现零次或者多次 |
X+ |
X+? |
X++ |
X表达式出现一次或多次 |
X{n} |
X{n}? |
X{n}+ |
X表达式出现n次 |
X{n,} |
X{n,}? |
X{n,}+ |
X表达式最少出现n次 |
X{n,m} |
X{n,m}? |
X{n,m}+ |
X表达式最少出现n次,最多出现m次 |
使用正则表达式
一旦在程序中定义了正则表达式之后就可以使用Pattern和Matcher来使用正则表达式。
Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后再利用Pattern对象创建对应的Matcher对象。
Pattern是不可变类,课提供多个并发线程安全使用
Matcher类提供了如下:
find():返回目标字符串是否包含于Pattern匹配的子串。
group():返回上一次与Pattern匹配的子串。
start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
end(): 返回上一次与Pattern匹配的子串在目标字符串中的结束位置加1.
lookingAt(): 返回目标字符串前面部分与Pattern是否匹配。
matches(): 返回整个目标字符串与Pattern是否匹配
reset(),将现有的Matcher对象应用于一个新的字符序列。
我们一般使用后Pattern来进行匹配,其一般使用的代码如下:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaab"); boolean b = m.matches(); boolean b1 = Pattern.matches("a*b", "aaaab"); System.out.println(b); System.out.println(b1); } }
import java.util.regex.Matcher; import java.util.regex.Pattern; public class MatchesTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String[] mails = { "[email protected]", "[email protected]", "[email protected]" }; String mailRegEx = "\\w{3,20}@\\w\\.(com|org|cn|net|gov)"; Pattern mailPattern = Pattern.compile(mailRegEx); Matcher matcher = null; for (String mail : mails) { if (matcher == null) { matcher = mailPattern.matcher(mail); } else { matcher.reset(mail); } String result = mail + (matcher.matches()?"是":"不是") + "一个有效的邮件地址!"; System.out.println(result); } } }