正则表达式

来源:互联网 发布:彩票双色球大赢家软件 编辑:程序博客网 时间:2024/06/14 04:15

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

原创粉丝点击