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

Java中,正则表达式(regex)的处理是通过Pattern类实现的。Pattern类提供了多种标志(flags)来修改正则表达式的行为。其中,Pattern.MULTILINE和Pattern.DOTALL是两个常用的模式,它们分别用于处理多行文本和让.匹配包括行终止符在内的任意字符。

 参考文档:Java中正则表达式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)-CJavaPy

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"字符

 参考文档:Java中正则表达式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)-CJavaPy

posted @ 2024-02-16 21:52  leviliang  阅读(164)  评论(0编辑  收藏  举报