正則表達式的深刻理解

爲了更好的理解正則表達式,咱們須要思考幾個問題。正則表達式

  1. 咱們要匹配確切的內容。
  2. 咱們要匹配類型的內容,包括同類(數字,字母)和次數。
  3. 咱們要匹配的相關內容,同時在位置(這個概念很重要)上要有要求。好比它的前面不能是什麼,後面不能是什麼。

針對這三類問題:正則表達式提供相應的語法。segmentfault

  1. 第一類問題:比較簡單,咱們直接寫咱們想要的值就能夠了,也是用的最多的。好比: /l/, /ge/ /hello/
  2. 第二類問題:這個狀況就比較多,例如,匹配數組,匹配大寫,匹配多個字符。針對這個提供一系列的語法:好比:/d, /w, [a-z], [0-9], ., +, *......
  3. 第三類問題:這個狀況其實相對簡單寫,畢竟位置就那麼幾種(開頭,結尾,前,後)。正則也提供了語法:好比:^, $, \b, \B, (?=), (?!), (?<=), (?<!)

針對其語法,咱們還須要知道同樣東西:什麼語法匹配字符位,什麼語法匹配位置,由於正則畢竟是匹配字符串的。因此每個正則表達式出來必定要知道他會匹配出幾個字符。
第一類和第二類的語法都是匹配字符位的,第三類語法都是匹配位置,不佔字符位。數組

在把語法的分類瞭解清楚了,下面咱們就須要瞭解正則的匹配執行的流程,這個對理解正則很是重要
我跟據個人理解,但願可以讓讀者簡單的理解下。以一個例子開頭吧:工具

var str="tfabCWa5684ab";
var reg=/ab/g;
console.log(str.match(reg));

正則的匹配過程:
首先由正則表達式的字符"a"獲取控制權,從位置0處開始匹配嘗試,匹配字符"t"失敗,控制權還在a上,將從位置1開始嘗試,匹配字符"f"失敗,控制權仍是在a上,將從2位置開始匹配,匹配字符「a」成功,而後控制權轉交給"b",從位置3處開始匹配,配字符"b"成功,記錄下這個匹配結果。控制權再次回到"a"(由於/g須要找出所有), 它從位置3(這個地方很重要)處開始匹配,匹配字符"b"失敗,控制權還在"a"上,接着往下匹配,直到從位置6處,匹配字符"a"成功,控制權轉交給"b", 從位置7開始匹配,匹配字符5失敗, 控制權回到a上,接着往下匹配,直到從位置11處,匹配字符"a"成功,控制權轉交給"b",從位置12開始匹配,匹配字符"b"成功,記錄下這個匹配結果。因此最終匹配結果是兩次ab,一次在index=2,一次在index=11.spa

咱們再來回顧下過程,能夠獲得如下總結:正則匹配都是從正則第一個條件開始(例子中d的"a"), 去找字符串的第一位。在沒有/g狀況下,條件1成立再看條件2,直到全部條件都成立,就匹配結束,若是有條件沒成立,正則的第一個條件接着去找字符串的第二位,如此往復嘗試。在有/g狀況下,匹配成功後,也會接着往下匹配,知道全部字符串位被正則校驗過。code

建議你們多讀幾遍這個流程,根據對這個流程理解,去想一想其餘正則表達式執行流程
理解了這個流程,你就算理解的正則的大部份內容了。
下面我還會再寫一篇文章關於正則的語法。語法原本應該像英文單詞同樣,須要你們記住就好了,爲啥還要寫一篇文章的呢。主要正則裏有幾個語法確實很是難理解。因此這裏有必要寫篇文章幫助你們理解下。
下篇文章的題目已經想好了:怎麼數出正則表達式裏字符位數和零寬斷言(?=,?<=, ?!, ?<!),
--- 新更新
文章已經寫完啦: https://segmentfault.com/a/11...blog

關注

歡迎關注小站小滑輪,小站都是平時工做中積累的一些小工具。是否是大家工做中也會遇到呢。關於小站的內容也能夠在博客下面留言哦。有什麼使用的工具想讓我補充,也能夠留言。ip

clipboard.png

相關文章
相關標籤/搜索