开发手册 欢迎您!
软件开发者资料库

Java中正则表达式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)

本文主要介绍Java中正则表达式怎样匹配换行符(\r\n,\n),从而实现多行匹配,实际上也就是Pattern.MULTILINE和Pattern.DOTALL的用法和区别。下面具体看一下。

1、Pattern.MULTILINE模式的用法

正则表达式中出现了^或者$, 默认只会匹配第一行. 设置了Pattern.MULTILINE模式,会匹配所有行。例如,

Pattern p1 = Pattern.compile("^.*b.*$");//输出false,因为正则表达式中出现了^或$,默认只会匹配第一行,第二行的b匹配不到。System.out.println(p1.matcher("a\nb").find());Pattern p2 = Pattern.compile("^.*b.*$",Pattern.MULTILINE);//输出true,指定了Pattern.MULTILINE模式,就可以匹配多行了。System.out.println(p2.matcher("a\nb").find());

2、Pattern.DOTALL模式的用法

默认情况下, 正则表达式中点(.)不会匹配换行符, 设置了Pattern.DOTALL模式, 才会匹配所有字符包括换行符。例如,

Pattern p1 = Pattern.compile("a.*b");//输出false,默认点(.)没有匹配换行符System.out.println(p1.matcher("a\nb").find());Pattern p2 = Pattern.compile("a.*b", Pattern.DOTALL);//输出true,指定Pattern.DOTALL模式,可以匹配换行符。System.out.println(p2.matcher("a\nb").find());

3、同时指定Pattern.MULTILINE和Pattern.DOTALL模式

实际情况中要是比较复杂的情况,可能Pattern.MULTILINE模式和Pattern.DOTAL模式需要同时指定来匹配多行,下面看一下,

Pattern p1 = Pattern.compile("^a.*b$");//输出falseSystem.out.println(p1.matcher("cc\na\nb").find());Pattern p2 = Pattern.compile("^a.*b$", Pattern.DOTALL);//输出false,因为有^或&没有匹配到下一行System.out.println(p2.matcher("cc\na\nb").find());Pattern p3 = Pattern.compile("^a.*b$", Pattern.MULTILINE);//输出false,匹配到下一行,但.没有匹配换行符System.out.println(p3.matcher("cc\na\nb").find());//指定多个模式,中间用|隔开Pattern p4 = Pattern.compile("^a.*b$", Pattern.DOTALL|Pattern.MULTILINE);//输出trueSystem.out.println(p4.matcher("cc\na\nb").find());