上图是官方文档的介绍,总结一下讲了两个知识点 ①是否获取匹配并保存匹配的值、②正向预查和反向预查。

1:解释是否获取匹配并保存匹配的值

  1. ()表示捕获分组,获取匹配,()把每个分组里的匹配的值保存起来
  2. (?:)表示非捕获分组,获取匹配,非捕获分组匹配的值不会保存起来,可以提高程序执行速度
  3. (?=?!?<=?<!)表示非捕获分组,不获取匹配,也不保存匹配的值

举例说明:

// 是否获取匹配
测试文本 abxoxcd
..(xox).. 匹配 abxoxcd
..(?:xox).. 匹配 abxoxcd ..(?=xox).. 匹配 abxo 获取匹配,一般匹配到了字符之后,该字符就被消耗、输出。不获取匹配,不会消耗字符。 // 是否保存匹配的值
测试文本 AAABBCaaA E666FF (A)\\* 匹配 AAA、A (\\w)\\+ 匹配 AAA、BB、aa、、FF (?:A)(B)\\* 匹配 ABB 因为非捕获分组不保存匹配的值,所以  (?:A)(B)\\* 匹配 ABB 第一个\\1表示(B)这个捕获组捕获到的值。  “注意:反向引用表示捕获到的值,而不是再次使用正则表达式” 这里用到了一个新的知识点,反向引用。

1、正则表达式中  “\number” 表示反向引用,表示引用一个捕获组,需要和小括号 “()” 一起使用

2、正则捕获组的下标从 0 开始,下标为 0 的组是整个表达式,下标为 1 的表示从左到右开始的第一个左括号所包含的值,后面的数字以此类推

3、捕获组在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用的方式,引用这个局部变量的值。

4、反向引用必须要与捕获组一同使用,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理

2:解释正向预查和反向预查

// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顾:
(?<=exp2)exp1 查找exp2后面的exp1
// 负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1

举例说明:

// 正向预查和反向预查
测试文本 abxoxcd ..(?=xox) 匹配 ab ..(?=oxo) 匹配不到 (?=xox).. 匹配xo (?<=xox).. 匹配 cd 预查只需要记住:1、环顾全局定位到非捕获组;2、不获取匹配(不消耗字符),不保存匹配的值(不能使用反向引用)

加餐

提问:强密码(必须包含数字、小写字母和大写字母三种字符,即这三种字符的组合,且不能使用特殊字符,长度在8-16之间),你认为必须是 1个数字+1个小写字母+1个大写字母 这种顺序吗?

^(?=.*[-])(?=.*[a-z])(?=.*[A-Z])[-9a-zA-Z]{,}$

(?=.*[0-9])表示任意字符+一个数字

(?=.*[a-z])表示任意字符+一个小写字母

  (?=.*[A-Z])表示任意字符+一个大写字母

  [0-9a-zA-Z]{8,16}表示8-16个数字、大小写字母

当有多个正向预查规则时它们是并列的,不是串行的

举例说明:

测试文本 abc2abc

  \\d(?=a)(?=b)  匹配不到

  \\d(?=a)(?=.b) 匹配    当然这是为了演示它的规则,其实可以写 \\d(?=ab)

这里主要的原因是:不获取匹配(不消耗字符)。

对于 ^(?=.*[-])(?=.*[a-z])(?=.*[A-Z])[-9a-zA-Z]{,}$ 
其实整个正则表示可以分为三部分:
/^(?=.*[0-9])[0-9a-zA-Z]{8,16}$/
/^(?=.*[a-z])[0-9a-zA-Z]{8,16}$/
/^(?=.*[A-Z])[0-9a-zA-Z]{8,16}$/
待匹配字符串必须同时满足这三部分才可以

【参考】

  1. https://www.jianshu.com/p/9c4979a3b7e4
  2. http://www.45fan.com/article.php?aid=19101105382209663550874595
  3. https://www.runoob.com/java/java-regular-expressions.html
  4. https://www.runoob.com/regexp/regexp-syntax.html
  5. https://www.cnblogs.com/archermeng/p/7537244.html
 

Java 正则?:?=?!的理解的更多相关文章

  1. Java正则速成秘籍(一)之招式篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  2. Java正则速成秘籍(二)之心法篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  3. Java正则速成秘籍(三)之见招拆招篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  4. Java基础之理解Annotation(与@有关,即是注释)

    Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...

  5. Java 集合深入理解(8):AbstractSequentialList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...

  6. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  7. Java 集合深入理解(4):List<E> 接口

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...

  8. java线程安全理解

    java线程安全理解 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. ...

  9. java 正则匹配空格字符串 正则表达式截取字符串

    java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...

随机推荐

  1. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) - D2. Optimal Subsequences (Hard Version)(主席树)

    题意:一共有$n$个数,$m$次询问,每次询问包括$k.pos$两个数,需要你从这$n$个数里面找出$k$个数,使得他们的总和最大,如果有多种情况,找出序号字典序最小的一组,然后输出这个序列中第$po ...

  2. JQ - 绑定(on)/解绑(off)事件(浅显的见解)

    on 绑定事件: $("selector").on("click",事件执行函数名); //为 selector 添加 点击事件 $("selecto ...

  3. 01 认识python

    python介绍 python的创始⼈为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决⼼ 开发⼀个新的脚本解释程序,作为ABC语 ...

  4. [SUCTF 2019]Pythonginx

    贴出源码 @app.route('/getUrl', methods=['GET', 'POST']) def getUrl(): url = request.args.get("url&q ...

  5. 解析-analysis

    解析-analysis 1.      解析-analysis 可以理解为分词. 解析由解析器——analyzer执行,解析器包括内置和用户自定义两种. 1.1.    解析器 1.1.1.   内置 ...

  6. 寒假pta一

    打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐 ...

  7. ES5-Array的新增方法

    Array.prototype.indexof(value):得到值在数组中的第一个下标 Array.prototype.lastIndexof(value):得到值在数组中的最后一个下标 Array ...

  8. mDNS故障排查(译)

    WLC上mDNS网关的理解及排查 第一部分:介绍 这篇文档描述了Bonjour协议在WLC上的操作,该文档旨在协助工程师理解该工作流量的原理以及提供故障排查的指导. 第二部分:需求和前提 知识需求: ...

  9. 【PAT甲级】1002 A+B for Polynomials (25 分)

    题意:给出两个多项式,计算两个多项式的和,并以指数从大到小输出多项式的指数个数,指数和系数. AAAAAccepted code: #include<bits/stdc++.h> usin ...

  10. C++11常用特性介绍——for循环新用法

    一.for循环新用法——基于范围的for循环 for(元素类型 元素对象 : 容器对象) { //遍历 } 1)遍历字符串 std::string str = "hello world&qu ...