【精】【入門篇】js正則表達式

 

前言

最近有了點時間,就回頭看了一下《學習正則表達式》這本書。怎麼說呢,這本書適合從零開始學習正則表達式或者有一點基礎可是想要增強這方面能力的讀者。這本書的風格是「實踐出真知」,使用概括方式講述, 也就是說, 會從特例講起, 最終歸結到通常狀況。不會先陳述觀點, 而後舉例, 而是先爲你們展現示例, 而後概括出通常性結論。因此剛開始的話仍是有點不習慣這種風格。正則表達式

吐槽只是皮一下而已啦,這本是仍是能夠的,感興趣的小夥伴不妨去看看,書本不厚,也就140頁左右。【附上pdf】緩存

 

正則表達式

1.爲何使用正則表達式?

典型的搜索和替換操做要求您提供與預期的搜索結果匹配的確切文本。雖然這種技術對於對靜態文本執行簡單搜索和替換任務可能已經足夠了,但它缺少靈活性,若採用這種方法搜索動態文本,即便不是不可能,至少也會變得很困難。函數

經過使用正則表達式,能夠:工具

    • 測試字符串內的模式。
      例如,能夠測試輸入字符串,以查看字符串內是否出現電話號碼模式或信用卡號碼模式。這稱爲數據驗證。
    • 替換文本。
      可使用正則表達式來識別文檔中的特定文本,徹底刪除該文本或者用其餘文本替換它。
    • 基於模式匹配從字符串中提取子字符串。
      能夠查找文檔內或輸入域內特定的文本。

2.什麼是正則表達式

「正則表達式是描述一組字符串特徵的模式, 用來匹配特定的字符串。 」
                                                ——Ken Thompson
學習

 

 正則表達式是對字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱爲「元字符」))操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。測試

                                                ——百度百科spa

定義千萬條,真理就一條。簡單來說,正則表達式描述了一個規則,經過這個規則能夠匹配一類字符串。這裏須要注意一下,正則表達式是一個規則.net

這裏有個輔助理解正則表達式的一個工具,Regexper 。regexp

 

上面這個示例展現的是利用正則表達式匹配手機號碼,正則表達式爲/^1[34578][0-9]{9}$/,從生成的輔助圖能夠看出,這個正則的規則是檢測以1開頭,第二位爲三、四、五、七、9 其中一個,以9位(自己1次加劇復8次)0-9數字結尾的的字符串。有了這個工具,能夠很形象的幫助咱們理解正則表達式。是否是很贊?好了好了,該回歸正題了。該鋪墊的已經鋪墊了,改舉例的也舉例了,那麼接下來就該講講最基本的語法啦。come on!htm

3.語法

正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲「元字符」)組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式做爲一個模板,將某個字符模式與所搜索的字符串進行匹配。

3.1 普通字符

普通字符包括沒有顯式指定爲元字符的全部可打印和不可打印字符。這包括全部大寫和小寫字母、全部數字、全部標點符號和一些其餘符號。

好比說正則表達式/is/ 匹配字符串'is',表達式裏面的字符串is就是普通字符'i'和's'構成。

非打印字符以下:

 

 

 

 

 

 

 

 

 

 

3.2 常見標準字符

固然,正則表達式裏面的標準字符不止這些,因爲本篇是入門篇,一些不常見或者比較複雜的字符符號在這裏就不涉及,想要了解的能夠隨時問度娘。

3.3 特殊字符(稱爲「元字符」)

許多特殊字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉義",即,將反斜槓字符 (\) 放在它們前面。要匹配 $ 字符自己,使用 \$。要匹配 |,使用 \|。要匹配\,使用 \\ 。

3.3.1 修飾符

修飾符與其餘語法特殊,字面量方法聲名的時候放到//後,構造函數聲明的時候,做爲第二個參數傳入。整個正則表達式能夠理解爲/正則表達式主體/修飾符(可選)

常見寫法好比:regex=/x/g、regex=/xXX/i 等,也能夠多個修飾符同時使用,好比regex=/xXX/ig,表示不區分大小寫而且全局匹配。

3.3.2 選擇和分組符

用圓括號將全部選擇項括起來,即徹底匹配,相鄰的選擇項之間用|分隔,即多選一。但用圓括號會有一個反作用,是相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種反作用。

                                                         

上面栗子reg=/x|y/,表示匹配字符x或y。

上面說到圓括會把相關的匹配緩存,什麼意思呢?在正則裏面,對一個正則表達式模式或部分模式兩邊添加圓括號將致使相關匹配存儲到一個臨時緩衝區中,所捕獲的每一個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每一個緩衝區均可以使用 '\n' 訪問,其中 n 爲一個標識特定緩衝區的一位或兩位十進制數。這就是正則裏面的反向引用。

關於反向?

正則表達式中有前瞻(Lookahead)和後顧(Lookbehind)的概念,須要注意一點,正則表達式中的前和後和咱們通常理解的先後有點不一樣。一段文本,咱們通常習慣把文本開頭的方向稱做「前面」,文本末尾方向稱爲「後面」。可是對於正則表達式引擎來講,由於它是從文本頭部向尾部開始解析的(能夠經過正則選項控制解析方向),所以對於文本尾部方向,稱爲「前」,由於這個時候,正則引擎還沒走到那塊,而對文本頭部方向,則稱爲「後」,由於正則引擎已經走過了那一塊地方。

好比正則表達式/(abc)d\1/匹配 abcabcd abcabcdabccca ,(abc)d\1能夠匹配字符串abcdabc,即\1表示把獲取到的第一組再匹配一次。

3.3.3 限定符(量詞)

限定字符又叫量詞,是用於表示匹配的字符數量的,即一個給定組件必需要出現多少次才能知足匹配。有*或+或?或{n}或{n,}或{n,m}共6種。

3.3.4 定位符

定位符使您可以將正則表達式固定到行首或行尾。它們還使您可以建立這樣的正則表達式,這些正則表達式出如今一個單詞內、在一個單詞的開頭或者一個單詞的結尾。

定位符用來描述字符串或單詞的邊界,^和$分別指字符串的開始與結束,\b描述單詞的前或後邊界,\B表示非單詞邊界。

reg=/1234/能匹配字符串0123456,而reg=/^1234/不能夠,由於這裏加了定位符,要求必須是以1開頭的字符串,好比匹配12345。

\b匹配一個邊界。因此若是使用正則表達式/\bword\b/ 匹配"word"、"a word"、"a word D"都是能夠的。想想這個字符串"a word."能匹配成功嗎?

答案是能夠的。有人可能就有疑問說,\b匹配的是否是字邊界嗎,word後面直接接了一個點,而不是空格或者沒有其餘東西。哈哈,其實大家都理解錯了。\b匹配的這個邊界,指[a-zA-Z_0-9]以外的字符,即不是\w字符,因爲.不屬於\w字符,因此就可以匹配成功。你們能夠本身試試看,利用網上的正則表達式測試工具本身動手試一下,好比 https://www.regexpal.com/

注意:不能將限定符與定位點一塊兒使用。因爲在緊靠換行或者字邊界的前面或後面不能有一個以上位置,所以不容許諸如 ^* 之類的表達式。

3.3.5 自定義字符集合

方括號[ ]表示字符集合,即[ ]表示自定義集合,用[ ]能夠匹配方括號裏的任意一個字符。reg=/[aeiou]/匹配'a','e','i','o','u'任意一個字符。/[0-9]/則表示匹配數字0-9之中其中一個,/[a-zA-Z]/則匹配全部大小寫字母中的一個字母。/[a-zA-Z0-9_]/則等效於\w。

可是,特殊字符(除了小尖角'^'和中劃線'-'外)被包含到方括號中,就會失去特殊意義,只表明其字符自己。reg=/[abc+?]/匹配'a','b','c'任意一個字符或者'+','?',即包含在自定義集合中的特殊字符'+','?'失去了特殊含義,只表示其字符自己的意思。

特殊字符小尖角'^',本來含義是匹配字符串的開始位置,若是包含在自定義集合[ ]中,則表示取反的意思。好比:reg=/[^aeiou]/匹配'a','e','i','o','u'以外的任意一個字符。

中劃線'-',在自定義集合[ ]中,表示「範圍」,而不是字符'-'自己,reg=/[a-z]/,匹配從a到z中26個字母的任意一個。

4 優先級

正則表達式從左到右進行計算,並遵循優先級順序,這與算術表達式很是相似。

相同優先級的從左到右進行運算,不一樣優先級的運算先高後低。下表從最高到最低說明了各類正則表達式運算符的優先級順序:

總結

正則表達式雖然比較煩瑣,但它是強大的,學會以後的應用會讓你除了提升效率外,會給你帶來絕對的成就感。

正則表達式遠不止這裏所涉及到的,因此這裏只是入門。俗話說師傅領進門,修行看我的。加油吧,騷年。保持一顆學習的心❤!

 

附:正則表達式速查表:https://www.jb51.net/tools/regexsc.htm

相關文章
相關標籤/搜索