談談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: