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

一、简介(?: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

 

Tags: