正则表达式中的“通配符”又被称为预定义字符,它可以匹配多个字符的特殊字符。
表 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 =
{
"kingkong@163.com",
"zhanxian@gmail.com",
"wawa@abc.xx"
};
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);
}
}
}