正则表达式 ? : > = ! 捕获分组、非捕获分组(?:)、获取匹配、非获取匹配(?= ?! ?<= ?<!)

有时我们需要获取的内容前后必须是特定内容,但又不获取这些特定内容的时候,此时我们应该用零宽断言,零宽断言简单来理解就是,正则表达式中应该匹配这些内容,但是这些内容不消耗匹配的字符串(如果不用零宽断言存在的问题是:特定内容前后的字符被消耗,导致字符串进行进一步匹配的时候,有些字符消耗了导致匹配不上)
简单来说:当我们从0开始匹配,如果最开始用到零宽断言,那么匹配上之后继续从0开始,如果后面还是零宽断言,匹配完当前零宽断言之后还是从0开始匹配,直到非零宽断言index才开始移动

				String str = "abcefabchg";
                Pattern p = Pattern.compile("^(?=a)(?=ab)abc.{1}");
                Matcher m = p.matcher(str);
                while(m.find()){
                        System.out.print(m.group());
                }
                输出结果:abce

eg:reg="^(?=a)(?=ab)abc.{1}" str=“abcefabchg” 首先从0开始匹配 ^,匹配成功,然后继续从ab中的a开始匹配,匹配上(?=a)但是此时不消耗字符,所以(?=ab)继续从ab中的a开始匹配,匹配上,此时仍然匹配上且不消耗字符,所以a继续从ab中的a开始匹配,匹配到abce,然后继续下一轮,此时是从abcefabchg中的f开始匹配,因为前面的都匹配上了且已经被消耗了,所以匹配不上。

捕获非捕获

*(?:)
表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
一个括号就是一个分组,有时候我们只需要外层最大的几个分组,那么里层的许许多多的小的分组就可以用非捕获组来表示,这样我们才好根据group来取最外面的几个大的分组。

获取非获取(零宽断言)

? 询问
= 是否匹配后面的正则表达式
! 是否不匹配后面的表达式
< 从昨天开始匹配
以上组合出现下面四种场景:
?=
正向肯定预查(look ahead positive assert),匹配pattern前面的位置
eg:“Windows(?=95|98|NT|2000)“能匹配"Windows2000"中的"Windows”,但不能匹配"Windows3.1"中的"Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
?!
正向否定预查(look ahead negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串
eg:例如"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
?<=
反向肯定预查(look behind positive assert),与正向肯定预查类似,只是方向相反。
eg:"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。
?<!
反向否定预查(look behind negative assert),与正向否定预查类似,只是方向相反。
eg:"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python正则表达式是一种强大的文本处理工具,它可以用来匹配、查找和替换字符串中的模式。正则表达式由一系列字符和特殊字符组成,用于描述要匹配的字符串的模式。 以下是一些常用的Python正则表达式操作: 1. 匹配:使用re模块的match()函数可以检查一个字符串是否与指定的模式匹配。例如,`re.match(pattern, string)`可以用来检查字符串是否以指定的模式开头。 2. 搜索:使用re模块的search()函数可以在一个字符串中搜索匹配指定模式的子串。例如,`re.search(pattern, string)`可以用来搜索字符串中是否包含指定的模式。 3. 查找所有匹配:使用re模块的findall()函数可以查找字符串中所有与指定模式匹配的子串,并返回一个列表。例如,`re.findall(pattern, string)`可以用来查找字符串中所有的数字。 4. 替换:使用re模块的sub()函数可以将匹配指定模式的子串替换为指定的字符串。例如,`re.sub(pattern, repl, string)`可以用来将字符串中的所有空格替换为逗号。 5. 分割:使用re模块的split()函数可以根据指定的模式将字符串分割成多个子串,并返回一个列表。例如,`re.split(pattern, string)`可以用来将一个以逗号分隔的字符串分割成多个子串。 正则表达式中的特殊字符包括: - `.`:匹配任意字符(除了换行符)。 - `*`:匹配前面的字符零次或多次。 - `+`:匹配前面的字符一次或多次。 - `?`:匹配前面的字符零次或一次。 - `[]`:匹配括号内的任意一个字符。 - `()`:创建一个捕获组,用于提取匹配的子串。 正则表达式还支持一些特殊的字符类别,如`\d`表示匹配任意一个数字,`\w`表示匹配任意一个字母、数字或下划线等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值