爲了更好的理解正則表達式,咱們須要思考幾個問題。正則表達式
針對這三類問題:正則表達式提供相應的語法。segmentfault
針對其語法,咱們還須要知道同樣東西:什麼語法匹配字符位,什麼語法匹配位置,由於正則畢竟是匹配字符串的。因此每個正則表達式出來必定要知道他會匹配出幾個字符。
第一類和第二類的語法都是匹配字符位的,第三類語法都是匹配位置,不佔字符位。數組
在把語法的分類瞭解清楚了,下面咱們就須要瞭解正則的匹配執行的流程,這個對理解正則很是重要。
我跟據個人理解,但願可以讓讀者簡單的理解下。以一個例子開頭吧:工具
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