首页 > 编程语言 >Java中正则表达式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)

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

时间:2024-02-16 21:55:35浏览次数:44  
标签:regex DOTALL Java 字符 Pattern MULTILINE 匹配

 

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

标签:regex,DOTALL,Java,字符,Pattern,MULTILINE,匹配
From: https://www.cnblogs.com/tinyblog/p/18017535

相关文章

  • (学习日记)三、BootSrap-JavaScript
    6.BootStrap6.1什么是bootstrap?-别人写好的css模板-Bootstrap中文网(bootcss.com)<!DOCTYPEhtml><html><head><title>BootStrap_Demo</title><metacharset="UTF-8"><linkrel="stylesheet"href=&quo......
  • 如何使用TailwindCSS和JavaScript构建自定义的HTML5视频播放器
    HTML5自带了一个原生视频播放器。它在浏览器中配备了简单的用户界面、功能和一些基本的控件。尽管通过浏览器的默认视频播放器的功能完美运行,但用户界面并不那么美观和时尚,总体上并不令人满意。因此,大多数现代Web应用程序和平台,如Udemy、Netflix、YouTube和AmazonPrime,不会将默......
  • 如何在 JavaScript 中使用大于和小于运算符
    在你的JavaScript程序中,你经常需要比较两个值,以确定一个是否大于另一个或小于另一个。这就是大于和小于运算符派上用场的地方。在本文中,我们将通过代码示例更详细地介绍如何使用这些运算符。(本文内容参考:java567.com)如何在JavaScript中使用大于运算符>你可以使用大于运算......
  • 在JavaScript中的防抖函数 - 通过在React中构建自动完成功能来解释
    当你将一个新应用推向生产环境时,你希望确保它用户友好。网站的性能是用户体验的关键部分。每个用户都希望网站及其内容能够快速加载。每一秒都是宝贵的,可能导致用户再也不会访问你的网站。在本指南中,我们将了解JavaScript中一个非常重要的技术,即防抖函数。然后,我将向您展示如何在......
  • JavaScript中的querySelector()方法是什么,它是如何工作的?
    在JavaScript中,有时您需要访问HTML元素。querySelector方法是一个WebAPI,它选择与传入的指定CSS选择器匹配的第一个元素。但是,更详细地说,这是如何工作的呢?在本文中,我们将看一些如何使用querySelector方法以及querySelectorAll方法的示例。(本文内容参考:java567.com)querySelector......
  • Java学习日记 Day16 正月初五,学习回归正轨!
    年前把SSM和Linux学完了,过年期间简单的做了个ssm的项目,再理解理解SSM。今天继续学了radis,也是比较重要的一个技术。radis:简单来说就是把数据存到缓存里的技术,常常和关系数据库结合使用,我们可以把数据库拿出来的数据存到缓存里,这样减少了io的次数,大大提高了效率。radis的学习大......
  • JavaSE的第三步 —— 变量
    一、变量什么是变量:参考停车场,变量本质上来说就是一个固定的空间,就类似于车位变量名则是可以看作是车位上编写的号码牌,而你所存储的数据就是车①、变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。②、可通过变量名来访问“对应的存储......
  • JavaSE的第二步 —— 注释、标识符、关键字
    一、注释每个人的编写代码的的习惯和理解都不一样,那么每一个需要完成的代码需求在个人写出来之后都是不一样的很多时候,我今天写的东西在未来的某天看来有较大的概率是不认识的,这与代码的复杂度有关。在Java中提供了注释这一功能,帮助我们对自己所编写代码进行标注,便于代码的维护......
  • javascript export default
    概述exportdefault每个js文件或组件,只能有一个;import的时候,不加花括号。其余的,可以多个export,import的时候需要加花括号。示例test.jsvarinfo={name:'zs',age:20}exportvarname1='张三'exportfunctionf1(){return'王五'}varname2='李四'functi......
  • zookeeper虚拟机使用和java api使用zookeeper案例
    zookeeper动物园管理员中间件,提供协调服务作用于分布式系统,发挥其优势,可以为大数据服务支持java,提供java和c语言的客户端api什么是分布式系统?很多台计算机组成一个整体,一个整体一致对外并且处理同一请求内部的每台计算机都可以相互通信(rest/rpc)客户端到服务端的一次请求到......