首页 > 其他分享 >正则表达式断言和分组捕获以及贪婪

正则表达式断言和分组捕获以及贪婪

时间:2022-08-18 12:03:51浏览次数:75  
标签:匹配 断言 正则表达式 捕获 正则 分组 正向

正则的写法比较多,而且方法也很多,做到提取,替换,都需要不同的正则来

一,零宽断言(正向先行断言,负向先行断言,负向后行断言,正向后行断言)

  断言: 断定正则里面有什么字符

  零宽:就是欸有宽度,只匹配位置,不占字符,就是匹配结果不返回断言的正则本身

  通过提取字符例子来看:

   const string = "<span>阅读数量:345</span>"

   我现在通过不同的断言提取345

   1.  正向先行断言    

        语法: (?=pattern)

        作用:匹配pattern前面的内容,不返回自身

        我需要提取string 里面的345, 正向线性断言正则, 我现在就是需要拿到</span>前面的内容,可以有如下正则;

       let regexp = /.+(?=<\/span>)/g

      匹配 

      string.match(regexp) 得到 数组 如图

String.prototype.match 方法检索返回一个字符串匹配正则表达式的结果。

 

 但是我们只需要匹配数字,可以设置 \d+  如图

 

 

 

 

 

2. 正向后行断言(正后顾)

   语法:(?<=parttern)

   作用:匹配表达式后面的内容不返回自身  

   有了前面的正向先行匹配,这个就比较简单理解,可以写出如下正则

     const regexp = /(?<=<span>阅读数量:)\d+/g

   

 

 

3. 负向先行断言(复前瞻)

    语法:(?!parttern)

    作用:匹配非pattern前面的内容,不返回自身

 

   例如 str = '我爱祖国,我是祖国的花朵' ; 我要找到不是“的花朵”前面的祖国, 可以写出如下正则

 const regexp = /祖国(?!的花朵)/g

 

 

 

4. 负向后行断言

  语法: (?<!pattern)

  作用:匹配非pattern表达式后面的内容,不返回本身

 例如对 "regex represents regular expression" 这个字符串;要想匹配单词开头的 re

 const reg = /(?<!\w)re/ 匹配非w中的re

 

 

对于这 4 个断言的理解,可以从两个方面入手:

  • 1、关于先行(lookahead)和后行(lookbehind):正则表达式引擎在执行字符串和表达式匹配时,会从头到尾(从前到后)连续扫描字符串中的字符,设想有一个扫描指针指向字符边界处并随匹配过程移动。先行断言,是当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符,故称为先行。后行断言,引擎会尝试匹配指针已扫过的字符,后于指针到达该字符,故称为后行。2、关于正向(positive)和负向(negative):正向就表示匹配括号中的表达式,负向表示不匹配。 

  • 先行和后行:后行断言 (?<=pattern)、(?<!pattern) 中,有个小于号,同时也是箭头,对于自左至右的文本方向,这个箭头是指向后的,这也比较符合我们的习惯。把小于号去掉,就是先行断言。
  • 正向和负向:不等于 (!=)、逻辑非 (!) 都是用 !号来表示,所以有 ! 号的形式表示不匹配、负向;将 ! 号换成 = 号,就表示匹配、正向。

 

二,捕获和非捕获

    也就是分组匹配

捕获组:匹配子表达式的内容,把匹配结果保存到内存中中数字编号或显示命名的组里,以深度优先进行编号,之后可以通过序号或名称来使用这些匹配结果。
 1. 数字编号捕获组(其实就是数字来放入表达式中)   语法:(exp)
解释:从表达式左侧开始,每出现一个左括号和它对应的右括号之间的内容为一个分组,在分组中,第0组为整个表达式,第一组开始为分组。
比如固定电话的:020-85653333
他的正则表达式为:(0\d{2})-(\d{8})
按照左括号的顺序,这个表达式有如下分组:
 我们用js 来验证一下:  

 

 reg.exec可以提取到不同的分组, 例如028 , 88773322

 

 

2. 以此类推  命名编号捕获组: 

  拿到年月日

分组捕获电话号码, 使用match匹配正则会有一个数组, 以电话号码举例分别如下

 

在groups中可以通过命名正则上面的命名来获取捕获值

 

 

 

3. 非捕获组:
语法:(?:exp)
解释:和捕获组刚好相反,它用来标识那些不需要捕获的分组,说的通俗一点,就是你可以根据需要去保存你的分组。

 

还是匹配电话号码   如果不想要前面的区号  就在区号前面加?:

let phone2 = '027-99887766'.match(/(?:0\d{2})-(\d{8})/) 

 

 

 

三,反向引用

z这里比较负责 ,以后专门写一篇文章

 

四, 贪婪和非贪婪

 贪婪: 尽可能多的匹配到符合条件的字符串

非贪婪:在贪婪量词后面加? 可以让贪婪正则变成懒惰正则

 

原作者姓名:假不理

原出处:掘金

原文链接:https://juejin.im/post/5b96a8e2

 

 

 

 

标签:匹配,断言,正则表达式,捕获,正则,分组,正向
From: https://www.cnblogs.com/qqfontofweb/p/16597769.html

相关文章

  • Mysql使用实际01---SQL分组查询
    1.SQL分组查询使用场景对记录的分组是通过关键字GROUPBY实现的,GROUPBY后面跟着一个定义组的构成的属性列表。 如果我们使用语句GROUPBYA1,……,Ak我们就把记......
  • 使用正则表达式替换手机号中间四位数为 * 号
    在有的接口或者界面上,为了保护手机号隐私,因此需要把手机号中间4位数变为*号,这种可以用正则表达式来实现替换构建匹配手机号的正则表达式要求手机号是11位,且第一位是1......
  • springboot~用正则表达式提取bearer token
    前后一体的应用,是这样进行认证的用户向服务端发送验证信息(用户名、密码);服务端验证成功就向用户返回一个sessionid;服务端保存了这个session_id对应的信息,并写入用户......
  • Python逆向爬虫之正则表达式
    Python逆向爬虫之正则表达式字符串是我们在编程的时候很常用的一种数据类型,检查会在字符串里面查找一些内容,对于比较简单的查找,字符串里面就有一些内置的方法可以处理,对于......
  • 技术分享 | app自动化测试(Android)-- 属性获取与断言
    原文链接本文节选自霍格沃兹测试开发学社内部教材断言是UI自动化测试的三要素之一,是UI自动化不可或缺的部分。在使用定位器定位到元素后,通过脚本进行业务操作的交互,......
  • re相关正则表达式(re.sub、re.I 、re.S、re.M)
    re.I表示忽略大小写re.S表示全文匹配re.M表示全文拼配行尾段位的字符或者数字,影响^和$re.sub表示替换使用方法:re.sub(pattern,repl,string,count=0,flags=0)......
  • 正则表达式
     定义:/[0-9]+/、 /[0-9]+/i、/[0-9]+/g、/[0-9]+/gi规则:^和$匹配一个位置,开始和结束;*、+、?表示重复次数,分别为任意次、至少一次、零次或1次;中括号表示范围[a..z]......
  • [2007年NOIP普及组] 纪念品分组
    元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪......
  • 正则表达式查找邮箱等数据
    相当于一个小工具,记录一下。importjava.util.regex.Matcher;importjava.util.regex.Pattern;//正则表达式实例,查找数据中的邮箱手机号和座机号publicclassRegex......
  • 【MySQL】分组GROUP BY
    目录1.GROUPBY分组使用2.使用多个列分组3.GROUPBY中使用WITHROLLUP1.GROUPBY分组使用例:求员工表中各部门的平均工资使用GROUPBY子句将数据按部门分SELECT depa......