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。
网友评论