首页 > 其他 > 详细

谈谈regex (?:) (?=) (?!) (?<=) (?<!)

时间:2020-09-25 08:15:22      阅读:95      评论:0      收藏:0      [点我收藏+]

一、简介(?:pattern)、(?=pattern)、 (?!pattern)、 (?<=pattern)、 (?<!pattern)

技术分享图片

这是我做的一张思维导图,说一个容易被忽视的地方,就是零宽断言会匹配出任何满足pattern的位置,而不是像捕获组一样下次匹配是在上次匹配记录之后开始的。

例如:

 技术分享图片

 

二、快速理解零宽断言

  举个栗子,有以下文本:

1 我要吃好吃的 我要下班 我要睡觉
2 我不要吃好吃的 我要下班 我要睡觉
3 我要吃好吃的 我要下班 我不要睡觉

伪代码:
positive_lookahead_regex = 我要下班(?=我要睡觉)  //这里的含义为 匹配"我要下班"这个模式的同时满足"我要睡觉"这个模式。
negative_lookahead_regex = 我要下班(?!我要睡觉)  // 这里的含义为 匹配"我要下班"这个模式的同时满足 不是"我要睡觉"这个模式。

positive_lookbehind_regex = (?<=我要吃好吃的)我要下班  
negative_lookbehind_regex = (?<!我要吃好吃的)我要下班 

   快速记忆方法:

  1、首先(? 开头 表示非捕获组

  2、然后如果是负向的断言 则会跟 "<"

  3、最后 肯定 是"=",否定是"!"

  Q:  正向  肯定 预查    equals      (?=pattern)

             负向  否定 预查    equals      (?<!pattern)

 

四、实践中不断理解

str1 = "123456789 12384"
pattern = "\B(?=(?:\d{3})+(?!\d))"

Q:如果用这个模式去 匹配str1,并且对匹配到的位置进行替换成","
最终结果会是什么,这个过程是怎样的?

最好自己有答案,在看结果哦~

技术分享图片
str1 = "123456789 12384"
pattern = "/\B(?=(?:\d{3})+(?!\d))/g"
str1.replace(pattern,‘,‘)


// "123,456,789 12,384"
View Code

 

谈谈regex (?:) (?=) (?!) (?<=) (?<!)

原文:https://www.cnblogs.com/wikis/p/13727432.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!