java正则表达式零宽断言(预搜索) 详解(附图)

java预搜索分为两种:

  1. 正向预搜索(正向的含义是预搜索匹配的位置后)
    a. 正向预搜索匹配(?=exp)(匹配位置后有被表达式exp匹配的字符)
    b. 正向预搜索不匹配(?!exp) ((匹配位置后不能出现被表达式exp匹配的字符))
  2. 反向预搜索(反向的含义是预搜索匹配的位置前)
    a. 反向预搜索(?<=exp)(匹配位置前有被表达式exp匹配的字符)
    b. 反向预搜索不匹配(?<!exp) (匹配位置前不能出现被表达式exp匹配的字符)
    上面是解释不好理解,下面是演示:
public class rege {
    public static void main(String[] args) {
        //注:预搜索匹配的是位置,不是具体字符,要谨记,而位置即两个字符间的夹缝,没有宽度。
        //例如:"ab"的中间有个位置,"a b"中a和空格间有个位置,空格和b之间也有个位置
        //1、预搜索的括号不作为一个组,它不记录预搜索括号内匹配到的字符串
        //2、预搜索匹配的字符串的位置,^(?<!hello\s)是错误的用法,因为‘^’匹配的是开始位置,预搜索不能匹配位置的位置
        //3、预搜索四种使用
        //      合法:正则1-正向预搜索  反向预搜索-正则1
        //      合法:正则1-正向预搜索1-正向预搜索2   和    反向预搜索1-反向预搜索1-正则1
        //      合法:反向预搜索-正则1-正向预搜索
        //      合法:正则1-正向预搜索-正则2
        String str1 = "java and python,java good,lang";

        //正向预搜索,(?=good)匹配的是位置,即匹配后面跟着good字符串的 java\\s
        Pattern p1 = Pattern.compile("java\\s(?=good)");
        //正向预搜索不匹配,(?!good)匹配的是后面没有跟着good字符串的 java\\s
        Pattern p2 = Pattern.compile("java\\s(?!good)");
        //反向预搜索,(?<=hello\\s)匹配的是位置,即匹配紧跟 hello\\s 的java 预搜索的括号不作为一个组
        Pattern p3 = Pattern.compile("(?<=hello\\s)java");
        //反向预搜索不匹配,(?<!hello\\s)不匹配紧跟 hello\\s 的 java
        Pattern p4 = Pattern.compile("(?<!hello\\s)java");
        //下面的表达式 (?<=and\\s) 匹配的是python前的位置,这个位置前面是 and\\s
        //因此若将表达式写成 java\\s(?<=and\\s)python 是匹配不到字符串的
        Pattern p5 = Pattern.compile("and\\s(?<=and\\s)python");
        Matcher m1 = p1.matcher(str1);
//        while (m1.find()) {
//            System.out.println("0: " + m1.group(0)); //java
//            System.out.println("匹配后的剩余字符:" + str1.substring(m1.end()));// good
//        }
    }
}

图解:

 //正向预搜索,(?=good)匹配的是位置,即匹配后面跟着good字符串的 java\\s
String str1 = "java and python,java good,lang";
Pattern p1 = Pattern.compile("java\\s(?=good)");

java零宽断言正相匹配图解    这是正向预搜索匹配的过程,其余正向不匹配,反向搜索和这个异曲同工,是很好推出来的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值