正则表达式

正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。
正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。例如,\\d表示数字0-9中的任意一个,\d就是元字符。
正则表达式中的元字符表如下:

元字符

正则表达式中的写法

意义

.

.

代表任意一个字符

\d

\\d

代表0-9的任何一个数字

\D

\\D

代表任何一个非数字字符

\s

\\s

代表空白字符,如’\t’、’\n’

\S

\\S

代表非空白字符

\w

\\w

代表可用作标识符的字符,但不包括"$"

\W

\\W

代表不可用于标识符的字符

\p{Lower}

\\p{Lower}

代表小写字母a-z

\p{Upper}

\\p{Upper}

代表大写字符A-Z

\p{ASCII}

\\p{ASCII}

ASCII字符

\p{Alpha}

\\p{Alpha}

字母字符

\p{Digit}

\\p{Digit}

十进制数字,即0-9

\p{Alnum}

\\p{Alnum}

数字或字母字符

\p{Punct}

\\p{Punct}

标点符号:!"#$%’&()*+,-./:;<=>?@[\]^_`{|}~

\p{Graph}

\\P{Graph}

可见字符:[\p{Alnum}\p{Punct}]

\p{Print}

\\p{Print}

可打印字符:[\p{Graph}\x20]

\p{Blank}

\\p{Blank}

空格或制表符:[\t]

\p{Cntrl}

\\p{Cntrl}

控制字符:[\x00-\x1F\x7F]

  • 在正则表达式中,"."代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符".",必须使用转义字符,即"\.",正则表达式中"\\."表示普通意义上的点字符。

在正则表达式中可以使用方括号括起来若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。例如reg = "[abc]4",这样字符串"a4"、"b4"、"c4"都是和正则表达式匹配的字符串。方括号元字符还可以为其他格式,如:

  • [^456] 代表4、5、6之外的任何字符
  • [a-r]代表a-r中的任何一个字母
  • [a-zA-Z]可表示任意一个英文字母
  • [a-e[g-z]]代表a-e或g-z中的任何一个字母(并运算)
  • [a-o&&[def]]代表字母d、e、f(交运算)
  • [a-d&&[^bc]]代表字母a、d(差运算)

在正则表达式中允许使用限定修饰符来限定元字符出现的次数,如A*代表A可在字符串中出现0次或多次。限定修饰符的用法如下表所示:

限定修饰符

意义

示例

?

0次或1次

A?

*

0次或多次

A*

+

1次或多次

A+

{n}

正好出现n次

A{2}

{n,}

至少出现n次

A{3,}

{n,m}

出现n-m次

A{2,6}

正则表达式使用示例:使用正则表达式来判断指定的变量是否为合法的E-mail地址

  • 分析:通常情况下E-mail的地址格式为"X@X.com.cn",字符X表示任意的一个或多个字符,@为E-mail地址中的特有符号,符号@后还有一个或多个字符,之后是字符".com",也可能后面还有类似".cn"的标记。总结以上特点,可以给出正则表达式"\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}"来匹配E-mail地址。字符集"\\w"匹配任意字符,符号+表示字符可以出现一次或多次,表达式"(\\.\\w{2,3})*"表示形如".com"格式的字符串可以出现0次或多次,最后的表达式"\\.\\w{2,3}"用于匹配地址中的结尾字符,如".cn"
  • 测试代码如下:
public class EmailMatch {
    public static void main(String[] args) {
        //定义要匹配E-mail地址的正则表达式
        String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";

        //定义要验证的字符串
        String strTest1 = "abc@";
        String strTest2 = "abc@163.com";
        String strTest3 = "abc";

        //判断字符串变量是否与正则表达式匹配
        if(strTest1.matches(regex)){
            System.out.println(strTest1+"是一个合法的E-mail地址格式");
        }
        if(strTest2.matches(regex)){
            System.out.println(strTest2+"是一个合法的E-mail地址格式");
        }
        if(strTest3.matches(regex)){
            System.out.println(strTest3+"是一个合法的E-mail地址格式");
        }
    }
}

输出:

abc@163.com是一个合法的E-mail地址格式

总结:正则表达式在字符串匹配中真的很实用,是编程要掌握的必不可以的技能!