正则表达式 - 预查模式详解(?:)、(?=)、(?!)、(?<=)、(?<!)区别

目录

非捕获元

零宽

代码讲解

(?=)非捕获匹配

(?=)正向肯定预查

(?!)正向否定预查

(?<=)反向肯定预查

(?

区别总结


非捕获元

([0-9]|[a-z])表示数字或小写字母,用圆括号 () 将所有选择项括起来,相邻选择项用 | 分隔。

() 表示捕获分组,() 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)

但用圆括号会有一个副作用,使相关的匹配会被缓存,因此引入非捕获元?: 可以取消结果缓存

零宽

非捕获元和^ 代表开头,$ 代表结尾,\b 代表单词边界一样,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为"零宽"

实例讲解:^abc[1|2]  ^表示开头含义,并不会占用匹配字符串的位置,a匹配a字符位置。

代码讲解

(?=)非捕获匹配

public static void main(String[] args) {
        //?: 匹配AB或者AC
        Pattern pattern = Pattern.compile("A(?:B|C)");
        Matcher matcher = pattern.matcher("AB");
        //输出AB
        while (matcher.find()){
            System.out.println(matcher.group());
        }
    }

(?=)正向肯定预查

public static void main(String[] args) {
        //?= 匹配以B或者C结尾的A字符串
        Pattern pattern = Pattern.compile("A(?=B|C)");
        Matcher matcher = pattern.matcher("AB");
        //输出B前面的A
        while (matcher.find()){
            System.out.println(matcher.group());
        }
    }

(?!)正向否定预查

public static void main(String[] args) {
        //?! 匹配不以B或者C结尾的A字符串
        Pattern pattern = Pattern.compile("A(?!B|C)");
        Matcher matcher = pattern.matcher("ABACAD");
        //输出D前面的A
        while (matcher.find()){
            System.out.println(matcher.group());
        }
    }

(?<=)反向肯定预查

public static void main(String[] args) {
        //?<= 匹配以B或者C开头的A字符串
        Pattern pattern = Pattern.compile("(?<=B|C)A");
        Matcher matcher = pattern.matcher("ABACAD");
        //输出B后面中的A和C后面的A
        while (matcher.find()){
            System.out.println(matcher.group());
        }
    }

(?<!)反向否定预查

public static void main(String[] args) {
        //?<! 匹配不以B或者C结尾的A字符串
        Pattern pattern = Pattern.compile("(?<!B|C)A");
        Matcher matcher = pattern.matcher("ABACAD");
        //输出第一个A
        while (matcher.find()){
            System.out.println(matcher.group());
        }
    }

区别总结

非捕获单元

格式

描述

示例

说明

?:

(?:Pattern)

非捕获元

A(?=B|C)

常用于(?:a|b)选择中,匹配AB或AC

?=

(?=Pattern)

正向肯定预查(零宽正向先行断言)

A(?=B|C)

匹配以B、C结尾的A

?!

(?=Pattern)

正向否定预查(零宽负向先行断言)

A(?!B|C)

匹配不以B、C结尾的A

?<=

(?=Pattern)

反向肯定预查(零宽正向后行断言)

(?<=B|C)A

匹配以B、C开头的A

?<!

(?=Pattern)

反向否定预查(零宽负向后行断言)

(?<!B|C)A

匹配不以B、C开头的A

TIP:

        开头结尾是相对于匹配字符串来说,不是文本的开头结尾。

参考:

正则表达式的先行断言(lookahead)和后行断言(lookbehind)

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值