包
java.uti.regex
类
Pattern
正则表达式的编译表示形式
Matcher
通过解释 Pattern 对 character sequence 执行匹配操作的引擎
构造摘要
字符
x 字符 x
\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 (‘\u0009’)
\n 新行(换行)符 (‘\u000A’)
\r 回车符 (‘\u000D’)
\f 换页符 (‘\u000C’)
\a 报警 (bell) 符 (‘\u0007’)
\e 转义符 (‘\u001B’)
\cx 对应于 x 的控制符
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符集
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
用法
创建Pattern
Pattern p = Pattern.compile(String regex);
创建Matcher
Matcher m = p.matcher(CharSequence input);
判断给定的CharSequence与当前regex是否匹配
boolean b = m.matches();
案例
电子邮件
错误,例如: aaa_bbb@qq.com
^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$
正确,但是针对类似“qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq”这样的字符串,容易卡死
^([a-z0-9A-Z]+[\\.\\_\\-\\*\\^]*)+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$
解决办法:
public static boolean validate(String email) {
if (email != null
&& email.indexOf("@") != -1 // 必须有"@"
&& email.indexOf(".") != -1 // 必须有"."
&& email.indexOf("@") == email.lastIndexOf("@") // 只能有一个"@"
&& email.lastIndexOf(".") - email.indexOf("@") > 1 // "@"之后必须有".",因"@"之前也可以出现".",所有必须用lastIndexOf(".")判断
&& !".".equals(String.valueOf(email.charAt(email.indexOf("@")+1)))) {// "@"之后可以有多个".",要限制每个"."都不可以靠近"@"
String domain = email.substring(email.lastIndexOf(".")+1);
if (domain == null || "".equals(domain)) {// "."不能是最后一个字符
return false;
} else if (!domain.matches("[a-zA-Z]{2,}")) {// 最后一个"."后的字符串必须是一个至少2位的字母
return false;
} else {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(email);
return matcher.matches();
}
} else {
return false;
}
}
日期
错误,以下格式通过 “2000-02-29 23:59:59”,“2000-02-29”,“2000-2-29”,“2000-2-1”,“2000-12”,“2000-23”,但“2000-02”未通过
^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$
注:上述正则来自http://zhidao.baidu.com/link?url=l2TncG7lXXIMSjuHy1i2ji8N8XOKF2EqewY70i8UATc6WEVL4gfIC16eNYpQw3fvIMBYvxBm4jBgJGUXg2r6x_
正确,可验证yyyyMMddHHmmss这种日期格式,如“19920229235959”
^(?:(?!0000)[0-9]{4}(?:(?:0[1-9]|1[0-2])(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)0229)((0[0-9])|(1[0-9])|(2[0-3]))[0-5][0-9][0-5][0-9]{1}
注:上述正则来自http://blog.csdn.net/a9529lty/article/details/6913838