创建正则表达式的模式对象
使用Pattern.compile()静态方法创建Pattern对象。
Pattern pattern = Pattern.compile("//w"); //compile的参数是字符串形式的正则表达式
Pattern的相关常用方法
matcher()
使用Pattern.compile()静态方法创建Pattern对象后,再使用Pattern对象的matcher()方法产生一个Matcher对象。Matcher类中提了大量的用于模式匹配的方法。
接下来我们以一个实例来介绍Matcher对象的find()、group()、start()以及end()方法:
public static void main(String[] args) {
String str = "abcabcabcabc";
Pattern pattern = Pattern.compile("abc+"); //compile的参数是字符串形式的正则表达式
Matcher matcher = pattern.matcher(str); //matcher的参数时要进行匹配的主串
while (matcher.find()) {
System.out.println("匹配结果: " + matcher.group() + "起始位置: " + matcher.start() + "结束位置" + (matcher.end() - 1));
}
}
find()方法将依照次序匹配主串中的全部内容,发现一个匹配结果就返回true,如果没有能够匹配的子串将返回false。group()方法将返回上一次匹配成功的子串,如果在发生匹配之前调用或者在匹配失败后调用均会抛出异常,start()和end()方法则会返回上一次匹配成功的子串在主串中的起始位置的索引以及末尾位置的索引加一。要注意的是find匹配成功后的下一次匹配总是从matcher1.last()处开始。
split()
Pattern的split()方法产生的返回值与String的split一样只是参数用法略有区别。
String的split方法:
public String[] split(String reglex)
public String[] split(String reglex, int limit)
Pattern的split方法:
public String[] split(String str)
public String[] split(String str, int limit)
可以看到两个类的方法参数的区别仅在于第一个参数String中传入的是字符串形式的正则表达式,而Pattern传入的则是进行模式匹配的主串。
Pattern标志
compile方法还有一个重载方法:compile(String reglex,int flag)。此方法允许我们指定一个标志来采用不同的匹配规则。flag的取值有如下几种:
flag取值 | 效果 |
---|---|
Pattern.CANON_EQ | 仅当两个字符进行规范分解后完全相等才会匹配。例如:\u030A会匹配?,默认模式下不会匹配 |
Pattern.CASE_INSENSITIVE(?i) | 与Pattern.UNICODE_CASE连用可以忽略大小写 |
Pattern.COMMENTS(?x) | 空格符被忽略,以#开始的字符串被看作注释忽略 |
Pattern.DOTALL(?s) | "."匹配所有字符,包括行终止符。默认情况下不会匹配行终止符 |
Pattern.MULTILINE(?m) | “^”匹配行开始以及字符串的开始,“$”匹配行的结束以及字符串的结束,默认情况下"^"进匹配字符串开始“$”进匹配字符串结束 |
Pattern.UNICODE_CASE(?u) | 与Pattern.CASE_INSENSITIVE连用可以忽略大小写 |
Pattern.UNIX_LINES(?d) | “.”、"^“和”$"进匹配行终止符 |