其实说到正则表达式,大家并不陌生,在J2EE开发中,正则表达式使用非常普遍,其简单易用,灵活性强,受到广大码农群众的青睐!下面,讨论一下Java的正则表达式:
支持的合法字符列表:
x :字符x(x代表任何合法字符)
\0mnn:八进制0mnn所表示的字符
\xhh:十六进制0xhh所表示的字符
\uhhhh:十六进制0xhh所表示的unicode字符
\t:制表符('\u0009')
\n:换行符('\u000A')
\r:回车符('\u000D')
\f:换页符('\u000C')
\a:报警符('\u0007')
\e:Escape符('\u001B')
\cx:x对应的控制符。如\cM匹配Ctrl-M。x值必须为A~Z或a~z之一。
特殊字符,在使用时必须先转义(在前面加\),下面为特殊字符列表:
$:匹配一行的结尾。
^:匹配一行的开头。
():标记子表达式的开始和结束位置。
[]:用于确定中括号表达式的开始和结束位置。
{}:用于标记前面子表达式的出现次数。
*:指定前面子表达式可以出现零次或多次。
+:指定前面子表达式可以出现一次或多次。
?:指定前面子表达式可以出现零次或一次。
.:匹配除换行符\n之外的任何单字符。
\:用于转义下一个字符,或指定八进制、十六进制字符。
|:指定两项之间任选一项。
通配符,也称预定义字符:
.:匹配任何字符。
\d:匹配0~9之间数字。
\D:匹配非数字(与\d相反,下面同理)。
\s:匹配所有的空白符,包括空格、制表、回车、换页、换行等。
\S:匹配所有非空白符。
\w:匹配所有单词字符,包括0~9,26个英文大小写字母,下画线(_)。
\W:匹配所有非单词字符。
其中d代表digit,数字的意思;s代表space空白;w代表word单词。大写刚好相反。
方括号表达式:
[]:表示枚举,如[abc]表示a、b、c表示其中任意一个字符。
-:表示范围,如[a-f]表示a~f范围内的字符,可以与枚举功能组合使用[a-fg-x],a~f、g~x范围内的字符。
^:表示不在,如[^abc]表示不是abc任意一个字符,[^a-f]不在a~f范围内的字符。
&&:表示交集,如[a-z&&[^abc]],等价于[d-z].
边界匹配符:
^:行的开头。
$:行的结尾。
\b:单词的边界。
\B:非单词的边界。
\A:输入的开头
\G:前一个匹配的结尾。
\Z:输入的结尾,仅用于最后的结束符。
\z:输入的结尾。
正则表达式支持的数量标识符有3种模式:
1.贪婪模式(Greedy):默认采用贪婪模式
2.勉强模式(Reluctant):以?做后缀
3.占有模式(Possesive):以+做后缀
贪婪模式匹配各类:
X?:表达式X出现零次或一次
X*:表达式X出现零次或多次
X+:表达式X出现多次或一次
X{n}:表达式X出现n次
X{n,}:表达式X至少出现n次
X{n,m}:表达式X至少出现n次,至多出现m次。
其他模式只要基于贪婪模式后面加上后缀即可,如占有模式下的X{n,m}为X{n,m}+。
以上量正则表达式基础,Java中使用正则表达式有两个类,分别为Pattern和Matcher。下面给出Demo:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegx1 {
public static void main(String[] args) {
String[] mails={"[email protected]","[email protected]","[email protected]","[email protected]"};
String mailRegEx="\\w{3,20}@\\w+\\.(com|org|cn|net|gov)";
Pattern p=Pattern.compile(mailRegEx);
Matcher m=null;
for(String mail : mails){
if(m==null)
m=p.matcher(mail);
else
m.reset(mail);
String result=mail+(m.matches()?" is a ":" not a ")+"valid mail address!";
System.out.println(result);
}
}
}
输出结果:
[email protected] is a valid mail address!
[email protected] is a valid mail address!
[email protected] is a valid mail address!
[email protected] not a valid mail address!