Java中的正则表达式

正则表达式中的“通配符”又被称为预定义字符,它可以匹配多个字符的特殊字符。

表 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 = 
            {
                "[email protected]",
                "[email protected]",
                "[email protected]"
            };
        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);
        }
    }

}


 

你可能感兴趣的:(java,正则表达式)