首页 > 其他分享 >Pattern的多种匹配模式

Pattern的多种匹配模式

时间:2024-07-26 10:57:54浏览次数:14  
标签:匹配 Pattern System 模式 compile matcher println out

参考: 好文→ Pattern的多种匹配模式 – 《JAVA编程思想》42

目录标题

单行匹配

Pattern.DOTALL(?s):默认匹配模式下 “.” 不会匹配换行符(\n),此模式下 "."会匹配换行符(\n),这意味着正则表达式可以在多行文本中进行匹配。

# 默认匹配
System.out.println(Pattern.compile("[A-Z].*").matcher("ABC\nDEF").matches()); // false
思路引导1. 先看方法是matches,查看是整个字符串都匹配上正则表达式。
思路引导2. [A-Z]开头后面不包含\n就行

# 默认查找
Matcher matcher = Pattern.compile("[A-Z].*").matcher("ABC\nDEF");
while (matcher.find()) {
    System.out.print("," + matcher.group() + ""); // ,ABC,DEF
}
思路引导1. 先看方法是find,字符串某个部分匹配上正则表达式即可。
思路引导2. [A-Z]开头后面不包含\n就行

# DOTALL匹配
System.out.println(Pattern.compile("[A-Z].*", Pattern.DOTALL).matcher("ABC\nDEF").matches()); // true
思路引导1. 先看方法是matches,查看是整个字符串都匹配上正则表达式。
思路引导2. [A-Z]开头后面任意

# DOTALL查找
Matcher matcher3 = Pattern.compile("[A-Z].*", Pattern.DOTALL).matcher("ABC\nDEF");
while (matcher3.find()) {
    System.out.print("," + matcher3.group() + ""); // ABC\nDEF
}

多行匹配

Pattern.MULTILINE(?m):多行模式并不改变.的行为,而是影响 ^$ 的行为。在默认情况下,^$ 分别匹配字符串的开始和结束。但在多行模式下,^$ 还可以分别匹配每行的开始和结束。如果需要仅匹配字符串开始和结束位置,可以使用 \A\Z

# 默认查找
System.out.println(Pattern.compile(".*BC").matcher("AB\nBC").find()); // true

# 默认查找
System.out.println(Pattern.compile("^.*BC$").matcher("AB\nBC").find()); // false
思路引导1.^$+find等价于matchs,查看是整个字符串都匹配上正则表达式。
思路引导2.前面谁都行就是不能为\n
# 默认匹配
System.out.println(Pattern.compile("^.*BC$").matcher("AB\nBC").matches()); // false

# MULTILINE查找
Matcher m2 = Pattern.compile("^.*BC$", Pattern.MULTILINE).matcher("AB\nBC");
if (m2.find()) {
    System.out.println(m2.group()); // BC
}

# MULTILINE查找
Matcher m3 = Pattern.compile("\\A.*BC\\Z", Pattern.MULTILINE).matcher("AB\nBC");
if (m3.find()) {
    System.out.println(m3.group()); // 没匹配到
}

正则匹配忽略大小写

Pattern.CASE_INSENSITIVE(?i):此模式下进行匹配会忽略 US-ASCII字符集中的大小写敏感,若需要忽略 Unicode 中的大小写敏感,需要结合 Pattern.UNICODE_CASE 使用。

// 忽略 Unicode 中的大小写敏感
System.out.println(Pattern.compile("[A-Z]+", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE).matcher("abc").matches()); // true
System.out.println(Pattern.compile("(?i)|(?u)[A-Z]+").matcher("abc").matches());  // true

// 忽略 US-ASCII字符集中的大小写敏感
System.out.println(Pattern.compile("[A-Z]+", Pattern.CASE_INSENSITIVE).matcher("abc").matches()); // true
System.out.println(Pattern.compile("(?i)[A-Z]+").matcher("abc").matches()); // true

Unicode 字符集中的大小写敏感

Pattern.CASE_INSENSITIVE (?u)

字符都将表示字面含义

Pattern.LITERAL:此模式下所有的转义字符或元字符都将表示字面含义,不代表任何特殊意义

System.out.println(Pattern.compile("\\s").matcher("\\s").matches()); // false
System.out.println(Pattern.compile("\\s", Pattern.LITERAL).matcher("\\s").matches()); // true

考虑字符的等价性

Pattern.CANON_EQ:此模式下进行匹配会考虑字符的等价性。
例如:正则表达式 \u003f 会匹配字符 , 因为 的 unicode 编码就是 \u003f

System.out.println(Pattern.compile("\\u003f", Pattern.CANON_EQ).matcher("?").matches()); // true

会忽略正则表达式中的空格及#开始后面的部分

Pattern.COMMENTS(?x)

Pattern p1 = Pattern.compile("#[A-Z]+");
System.out.println(p1.matcher("#ABC").matches());
Pattern p2 = Pattern.compile("#[A-Z]+", Pattern.COMMENTS);
System.out.println(p2.matcher("#ABC").matches());
Pattern p3 = Pattern.compile("[0-9]+#[A-Z]+", Pattern.COMMENTS);
System.out.println(p3.matcher("123").matches());
Pattern p4 = Pattern.compile("[A-Z]+ [0-9]+");
System.out.println(p4.matcher("ABC123").matches());
Pattern p5 = Pattern.compile("[A-Z]+ [0-9]+", Pattern.COMMENTS);
System.out.println(p5.matcher("ABC123").matches());

只会将 \n 认作换行符

Pattern.UNIX_LINES(?d):在此模式下进行匹配,在 .^$ 三种行为中,只会将 \n 认作换行符,默认模式下会将 \r 也认作换行符。

String data = "A\r\nB\rC\nD";
System.out.println(data);
System.out.println("-------------------------------------");

Matcher m = Pattern.compile(".+").matcher(data);
while (m.find()) {
    System.out.println("[" + m.group() + "]");  // [A][B][C][D]
}
System.out.println("-------------------------------------");

m = Pattern.compile(".+", Pattern.UNIX_LINES).matcher(data);
while (m.find()) {
    System.out.println("[" + m.group() + "]");  // (A\r)、(B\rC)、(D)
}

\w 可以匹配任何语言的任何字符

Pattern.UNICODE_CHARACTER_CLASS (?U)\w 默认只匹配[a-zA-Z_0-9] 开启此模式后,\w 可以匹配任何语言的任何字符。

Pattern p1 = Pattern.compile("\\w+");
System.out.println(p1.matcher("中国").matches());

Pattern p2 = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);
System.out.println(p2.matcher("中国").matches());

标签:匹配,Pattern,System,模式,compile,matcher,println,out
From: https://blog.csdn.net/weixin_37646636/article/details/140658021

相关文章

  • Java NIO框架Netty教程(六)-Java NIO Selector模式
    全文详见个人独立博客:JavaNIO框架Netty教程(六)-JavaNIOSelector模式JavaNIO框架Netty教程(六)-JavaNIOSelector模式看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实......
  • 单机模式下ElasticSearch8(ES8设置账号密码访问)
     重置密码报错:ERROR:Failedtoresetpasswordforthe[elastic]user 修改配置文件/config/elasticsearch.yml修改或添加discovery.type:single-nodexpack.security.enabled:truexpack.security.http.ssl.enabled:falsexpack.security.enrollment.enabled:......
  • Python - 检测字母模式而不迭代所有可能的组合
    对于可能不太有用的标题,我表示歉意,我不知道如何将这个问题总结为一句话。我正在尝试计算Python3.10中一个单词有多少个“单位”长。一个“单位”是(C表示辅音,V表示元音)CV或VC或C或V(后两者仅在没有配对时使用)可以制作)。例如,“件”将为三个单位......
  • 【golang设计模式】—— 简单工厂模式
    模式定义简单工厂模式(SimpleFactoryPattern):又称为静态工厂方法(StaticFactoryMethod)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。模式结构工......
  • C++设计模式汇总
    李忠建老师讲授设计模式笔记更新到抽象工厂模式:组件协作类:模板方法策略模式观察者模式单一职责类:装饰器模式桥模式模式对象创建类:工厂方法抽象工厂方法原型模式构建器模式对象性能类:单例模式享元模式接口隔离类:门面模式代理模式适配器模式中介者模式状态变......
  • 设计模式C++001__模板方法
    设计模式C++001__模板方法“组件协作”模式:现代软件专业分工之后的第一个结果就是“框架与应用程序的划分”,组件“协作”模式通过晚绑定,来实现框架与应用程序之间的松耦合。包括:模版方法,观察者模式,策略模式1、模板方法模式:动机:在软件构建过程中,对于一项任务,它常常有稳定的整......
  • 设计模式C++002__策略模式
    设计模式C++002__策略模式1、动机:在软件构建过程中,某些对象使用的算法是多种多样的,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。?如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?......
  • 设计模式C++003__观察者模式
    设计模式C++003__观察者模式1、动机:在软件构建过程中,我们需要为某些对象建立一种“通过依赖关系”--一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使得软件不好抵御变化。?使用面向对象技术,可以将这种依赖关系弱化,并形成......
  • 设计模式C++004__装饰器模式
    设计模式C++004__装饰器模式在软件组件设计中,如果职责划分不清晰,使用继承得到的结果往往会随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候关键是划清责任。单一职责模式分类中的设计模式:装饰器模式,桥模式1、装饰器模式:动机:在某些情况下,我们可能会“过渡地使用继承来扩......
  • 设计模式C++005__桥模式
    设计模式C++005__桥模式也是组合模式的具体体现。1、动机:由于某些类型的古有的实现逻辑,使得他们具有两个变化的维度,乃至多个维度的变化。?如何应对这种“多维度的变化”,如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度。2、桥模式:将......