美文网首页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中的正则表达式用法

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