Java中正则表达式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)
Java中,正则表达式(regex)的处理是通过Pattern类实现的。Pattern类提供了多种标志(flags)来修改正则表达式的行为。其中,Pattern.MULTILINE和Pattern.DOTALL是两个常用的模式,它们分别用于处理多行文本和让.匹配包括行终止符在内的任意字符。
参考文档:
1、Pattern.MULTILINE模式的用法
Pattern.MULTILINE
模式影响^
和$
的行为, 默认只会匹配第一行.
在多行模式下,这两个边界匹配符分别匹配一行的开始和结束,而不是整个输入的开始和结束。设置了Pattern.MULTILINE
模式,会匹配所有行。例如,
import java.util.regex.Pattern; import java.util.regex.Matcher; public class Main { public static void main(String[] args) { Pattern p1 = Pattern.compile("^.*b.*$"); //输出fals,因为正则表达式中出现了^或$,默认只会匹配第一行,第二行的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模式的用法
默认情况下,.
字符不会匹配行终止符(如\n
)。当使用Pattern.DOTALL
模式时,.
将会匹配任意字符,包括行终止符。设置了Pattern.DOTALL
模式, 才会匹配所有字符包括换行符。例如,
import java.util.regex.Pattern; import java.util.regex.Matcher; public class Main { public static void main(String[] args) { 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
模式需要同时指定来匹配多行,代码如下,
import java.util.regex.Pattern; import java.util.regex.Matcher; public class Main { public static void main(String[] args) { Pattern p1 = Pattern.compile("^a.*b$"); //输出false System.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); //输出true System.out.println(p4.matcher("cc\na\nb").find()); } }
4、常用正则表达式
在处理Java中的正则表达式时,了解一些常用的正则表达式及其用途可以大大提高开发效率。常用参考如下,
正则表达式 | 描述 |
---|---|
^ |
行的开始, 在 MULTILINE 模式下匹配任意行的开始 |
$ |
行的结束, 在 MULTILINE 模式下匹配任意行的结束 |
. |
任意字符(默认不包括行终止符), 在 DOTALL 模式下包括行终止符 |
\s |
任意空白字符(空格、制表符、换行符等) |
\S |
任意非空白字符 |
\d |
任意数字字符 |
\D |
任意非数字字符 |
\w |
任意单词字符(字母、数字或下划线) |
\W |
任意非单词字符 |
[abc] |
匹配任何一个列在括号中的字符 (例如,匹配"a"、"b"或"c") |
[^abc] |
匹配任何不在括号中的字符 |
(ab) |
匹配括号内的表达式, 作为一个分组 |
a? |
匹配"a"零次或一次 |
a* |
匹配"a"零次或多次 |
a+ |
匹配"a"一次或多次 |
a{3} |
精确匹配3个"a"字符 |
a{3,} |
匹配3次或更多次"a"字符 |
a{3,6} |
匹配3到6次"a"字符 |
参考文档: