美文网首页Java
java中的正则表达式用法

java中的正则表达式用法

作者: 水煮鱼又失败了 | 来源:发表于2021-05-27 21:25 被阅读0次

1 场景

本文主要整理下java开发中正则表达式的相关用法。

2 图示

一图胜千言,相关用法,可参考下图:


java中的正则表达式用法.png

3 解析

3.1 相关类

java中使用正则表达式时,主要用到如下两个类:

// 正则匹配模式(根据正则字符串创建)
java.util.regex.Pattern

// 正则匹配器(根据模式Pattern创建,可用来进行正则匹配)
java.util.regex.Matcher

简单通用正则校验代码如下:

// 根据“正则字符串”,创建"匹配模式"
Pattern pattern = Pattern.compile("a*b");
// 根据“匹配模式”和“待匹配字符串”,创建“匹配器”
Matcher matcher = pattern.matcher("aaaaab");
// 使用“匹配器”对匹配器中的“待匹配字符串”,进行“正则匹配”。可多次调用,获取所有的匹配结果
while (matcher.find()){
    // 获取匹配到的字符串(每次调用matcher.matches(),如结果为true,可通过group()获取此次调用匹配到的新的内容)
    String matchesStr=matcher.group();
    System.out.println(matchesStr);
}

3.2 匹配范围

java中的正则匹配器Matcher,进行数据匹配时。可以通过调用不同的匹配方法,指定不同的匹配范围:

方法 说明
matcher.matches() 判断字符串"全部匹配正则"
matcher.lookingAt() 判断字符串"头部匹配正则"
matcher.find() 判断字符串"一部分匹配正则"(最常用)
可调用多次,获取多个满足匹配的字符串片段
该方法从该匹配器区域的开始处开始。如果该方法的前一次调用成功,且此后该匹配器未被重置,则在前一次匹配未匹配的第一个字符处开始。

3.3 获取匹配结果

执行3.2的匹配操作后,如果匹配结果为true,可以根据如下方法获取本次匹配所对应的被匹配到的字符串

如不执行"匹配"方法,直接"获取匹配详情"的相关方法,或匹配结果为"false",则报异常:java.lang.IllegalStateException: No match found

方法 说明
matcher.group() 获取"整个"正则匹配到的内容
matcher.group(x) 获取正则"第x个分组"匹配的内容
matcher.start() 正则匹配到的内容,在被匹配字符串的开始位置(匹配位置,包括此位置)
matcher.start(x) 正则匹配到的内容,正则内"第x个分组",在被匹配字符串的开始位置(匹配位置,包括此位置)
matcher.end() 正则匹配到的内容,在被匹配字符串的截止位置(匹配位置,不包括此位置)
matcher.end(x) 正则匹配到的内容,正则内"第x个分组",在被匹配字符串的截止位置(匹配位置,不包括此位置)

如正则表达式可在被匹配到的字符串中匹配到多个结果。每次执行matcher.find()后,如结果为true,执行matcher.group()得到的结果这次匹配为true的原因即被匹配到的字符串的内容)。

举例:

Pattern pattern = Pattern.compile("(\\d+)(a|b|c)+");
    Matcher matcher = pattern.matcher("123aaa__456bbb__");
    while (matcher.find()){
    System.out.println(matcher.group());
}

以上代码,输出的内容如下:

123aaa
456bbb

待匹配字符串中有两个满足正则表达式的部分,执行matcher.find(),前两次结果均为true。
其中123aaa第1次执行matcher.find()后,执行matcher.group()得到的结果。
其中456bbb第2次执行matcher.find()后,执行matcher.group()得到的结果。

3.4 进一步增强

java中执行正则表达式,可也在创建匹配器的时候,设置匹配标志,来实现java中正则匹配的增强模式,如下:

// 单个模式
Pattern pattern = Pattern.compile("正则字符串",Pattern.MULTILINE);
// 多个模式
Pattern pattern = Pattern.compile("正则字符串",Pattern.MULTILINE & Pattern.DOTALL);

增强模式,可也在java进行正则匹配的时候,进行特殊正则匹配,常用的如下:

标志 说明
Pattern.CASE_INSENSITIVE 不区分大小写匹配。开启此模式,匹配正则表达式时,不区分大小写。
Pattern.MULTILINE Pattern.MULTILINE:多行模式。正常模式的^和$只会尝试匹配第一行;多行模式,会匹配所有行。
Pattern.DOTALL 正常模式符号".",不匹配换行符\n。dotall模式,符号"."会匹配所有符号,包括换行符\n。
Pattern.COMMENTS 允许在模式中使用空格和注释。

4 建议

模式pattern线程安全, 匹配器matcher线程不安全。

创建pattern对象的时候,会对正则字符串进行解析,占用比较多的资源(涉及到DFA等类似耗资源的算法)。

因此建议相同匹配模式下的正则字符串创建一个pattern对象即可,一个pattern可创建多个matcher。

相关文章

  • java 正则表达式 简单入门

    java 正则表达式用法 最近学习编译原理,要用到正则表达式。本次要学习如何用java正则表达式。正则表达式:可以...

  • java中的正则表达式用法

    1 场景 本文主要整理下java开发中正则表达式的相关用法。 2 图示 一图胜千言,相关用法,可参考下图: 3 解...

  • Java @ synchronized

    参考: Java中Synchronized的用法 Java 多线程:synchronized 关键字用法(修饰类,...

  • python正则表达式详解

    #首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用法 环视用法...

  • python正则表达式浅析

    简单记录下python下正则表达式的用法,加深对正则表达式用法的记忆,方便以后爬虫本文选取了莫烦python中我觉...

  • 正则表达式

    用法。常用正则表达式。详细用法 //正则表达式:记录文本规则的代码 //常用的正则表达式的地方:登录,密码等格式的...

  • Java面试

    Java中Synchronized的用法Java面试准备Java HashMap 源码解析Java 位运算(移位、...

  • DB2教程

    词Java示例搜索字符串中的特定单词Java示例拆分正则表达式JJava示例拆分正则表达式Java示例替换首次出现...

  • 第二章 java程序优化

    本章主要知识点: java程序中字符串的优化 慎用正则表达式 java中集合的优化 java中IO优化 java中...

  • Kotlin学习笔记——基础语法篇之控制语句

    if...else... 用法 Kotlin中if...else...基本用法与C/C++,java中相同 例子 ...

网友评论

    本文标题:java中的正则表达式用法

    本文链接:https://www.haomeiwen.com/subject/oyndsltx.html