Java

java中的正则表达式用法

2021-05-27  本文已影响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。

上一篇下一篇

猜你喜欢

热点阅读