正则表达式 ?:

表达式
(?:ab)([a-z]*?)(?=df)来匹配77abcddf88,为何会得到:abcd。目的是不包含ab
(?:ab)([a-z]*?)(?=df)
?: 的确是非捕获组,但其含义是 不会在组中捕获 但会在匹配结果中出现
比如你这个正则,group[1]的值会是 cd
如果(ab)这样 group[1]的值是ab
但这两个匹配的结果是一样的 都是abcd
?=正声明,出现在右边即不被组捕获也不被结果捕获
? <=反向正声明 在左边 其他一样


2.这是一个比较抽象的概念,谈到相对位置,前或后,左或右,那就一定要有一个参照物的,这里所说的所在位置的左侧或右侧是对参照物而言的,并不是(? <=Exp)或(?=Exp)本身,我们可以把它所参照的位置理解为一个零宽度的位置或“缝隙”,下面举例说明吧
先从简单的开始,有两个字符串
str1 = "a123b "
str2 = "a123c123b "
有一个正则表达式:(? <=a)\d+(?=b)
这里的\d+是明确的,就是数字,它可以做为参照物,而(? <=a)在“缝隙”处加了一个限定条件,在它的左侧为a,这里的“缝隙”指的就是(? <=a)和\d+之间的“缝隙”,由(?=b)加了一个限定条件,在它的右侧为b,这里的“缝隙”指的就是\d+和(?=b)之间的“缝隙”,用它来匹配str1的结果是匹配成功,而匹配str2的结果是不成功,因为str2两组数字的两侧都不同时满足这两个条件

换成另一个正则表达式:(?=a)\d+(? <=b)
我们根本不用拿任何例子去试,从正则表达式本身就可以断定它匹配不到任何内容,因为它本身就是自相矛盾的,(?=a)附加的条件是在“缝隙”的右侧是a,而很明显这个式子里“缝隙”的右侧一定是数字才能匹配成功,(? <=b)同理

或者把以上的\d+直接写为123可能会更有组于你的理解


再来说下(?=ab)([a-z]*?)(?=df)这个表达式,如果用它来匹配77abcddf88字符串,也是可以匹配成功的,但匹配的结果是 abcd,因为(?=ab)要求它所参照的“缝隙”右侧为ab,这里只有77和ab之间的“缝隙”才满足条件,而(?=df)要求它所参照的“缝隙”右侧为df,这里只有cd和df之间的“缝隙”满足要求,所以匹配结果为abcd
而(? <=ab)([a-z]*?)(?=df)这个表达式,(? <=ab)要求缝隙的左侧为ab,这里只有ab和cd之间的“缝隙”满足要求,(?=df)同上,所以匹配结果为cd

比如字符串1234abcd:你用正则表达式(\d+)(\D+)匹配,$1的内容是1234,$2的内容是abcd;如果你用(?:\d+)(\D+)匹配,$1的内容是abcd,$2没有内容。也就是说(?:)内的匹配不进行记录。
(?:)这个括号是用来改变优先级的,没有记忆功能,不会映射到$1或者$n。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值