【入門篇】js正則表達式

前言

最近有了點時間,就回頭看了一下《學習正則表達式》這本書。怎麼說呢,這本書適合從零開始學習正則表達式或者有一點基礎但是想要加強這方面能力的讀者。這本書的風格是“實踐出真知”,使用歸納方式講述, 也就是說, 會從特例講起, 最終歸結到一般情況。不會先陳述觀點, 然後舉例, 而是先爲大家展示示例, 然後歸納出一般性結論。所以剛開始的話還是有點不習慣這種風格。

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

 

正則表達式

1.爲什麼使用正則表達式?

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

通過使用正則表達式,可以:

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

2.什麼是正則表達式

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

 

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

                                           ——百度百科

定義千萬條,真理就一條。簡單來講,正則表達式描述了一個規則,通過這個規則可以匹配一類字符串。這裏需要注意一下,正則表達式是一個規則。

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

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章