本文主要是在讀《JavaScript高級程序語言設計》一書有關正則表達式的章節的知識點記錄,方便後續查閱。javascript
正則表達式是用來描述字符組合的某種規則。它能夠幫助驗證字符串是否知足某種字符組合規則或者經過某個規則查找對應的字符序列。java
舉個例子:好比我想驗證一個輸入框中輸入的是不是手機號碼,那麼咱們須要爲這個輸入框定義一個輸入規則,好比11位字符、每一個字符都必須是0-九、以及更細節的信息像第一位不能是0等規則。此時咱們就能夠定義一個正則表達式,將全部的規則經過正則表達出來,去驗證輸入框的內容是否知足正則表達式定義的規則。正則表達式
JavaScript中的正則表達式對象有兩種定義方式:正則表達式直接量
和RegExp()構造函數
。定義代碼以下:數組
//定義JavaScript正則對象的兩種方式 var pattern = /s$/; var pattern = new RegExp("s$");
正則表達式中全部字母和數字都是按字面含義進行匹配的,例如'a'就能夠匹配到'a'字符。
JavaScript也支持非字母的字符匹配。正則表達式經過」」+字母的形式將字母原先的含義進行了轉義來表示其餘特殊的字符。例如\n匹配換行符。
正則表達式中不少符號具備特殊含義:^ $ . * + ? = ! : | / () [] {}。若是想要匹配這些字符須要使用"\"進行轉義。函數
如今咱們知道咱們能夠用a去匹配a字符,b去匹配b字符。那麼若是我須要匹配全部的小寫字母該怎麼作?
正則表達式使用[]來構造一個字符類。一個字符類能夠匹配它所包含的任意一個字符。例如/[abc]/就可以匹配字母」a」、」b」或」c」中的任意一個。另外在字符類中使用^能夠進行否認操做,例如'/[^abc]/'表示匹配」a」、」b」或」c」之外的任意一個字符。
字符類還可使用連字符表示字符範圍,例如/[a-z]/匹配全部小寫字母。因爲某些字符類很是經常使用,因此正則規範了一些特殊字符表示一個特定的字符類,例如/\w/等價於[a-zA-Z0-9]。編碼
如今咱們有有了新的需求,就是想要某個字符類匹配屢次,例如匹配5-7個數字,可使用/\d{5,7}/進行匹配,因爲某些重複種類很是經常使用,因此正則規範了特殊符號來表示,例如」+」表示匹配1次或屢次,等價於{1,}等。設計
使用重複進行匹配時會盡量多的進行匹配,咱們稱之爲貪婪匹配。例如/a+/能夠匹配一個或多個連續的字母a,當使用」aaa」做爲匹配字符串時,正則表達式會匹配連續的三個a。
非貪婪匹配只需在待匹配字符後跟隨一個?,例如:」??」、」+?」、」*?」或」{1,5}?」。例如/a+?/也能夠匹配一個或多個連續的字母a,可是它會盡量少的匹配。code
選擇:字符」|」用於分隔可選擇的字符,例如/d{3}|[a-z]{4}/能夠匹配三位數字或者四個小寫字母。選擇項的嘗試匹配次序是從左到右的,並且發現匹配項後就會忽略後面的選擇項。所以正則/a|ab/匹配字符串」ab」時只會匹配到第一個字母a。regexp
將子表達式組合成一個獨立單元,這就可使用」|」、」*」等來對這個單元進行處理。例如/Java(script)?/能夠用來匹配java或javascript,也就是script這個組合能夠出現0-1次。對象
()小括號除了能夠將子表達式組合成一個獨立單元,還可以定義子模式。當一個正則表達式成功地和目標字符串匹配時,能夠從目標字符串中提取出和圓括號中的子模式相匹配的部分。後面會進行詳細介紹。
引用
就是容許在同一個正則表達式的後部引用前面的子表達式。這是經過在字符」」後加一個數字來實現的。這個數字制定了帶圓括號的子表達式在正則表達式中的位置。這個位置是參與計數的左括號的位置
。例如/([Jj]ava([Ss]cript)?)siss(funw*)/正則中([Ss]cript)可使用2來指代。對正則表達式中前一個子表達式的引用,並非指對子表達式模式的引用,而是指與那個模式匹配的文本的引用。這樣,引用能夠用於實施一條約束,即一個字符串各個單獨部分包含的是徹底相同的字符。例如/‘」[‘」]/匹配位於單引號或雙引號之間的0個或多個字符,可是它並不要求左側和右側的引號匹配,若是要匹配左右的引號類型,可使用引用/([‘」])[w]1/。
若是不想生成帶編碼的引用
,可使用」(?:)」進行組合,不記憶與改組相匹配的字符。
有一些正則表達式的元素匹配的是字符之間的位置,而不是實際字符。例如b匹配一個單詞的邊界。有時稱這些元素爲正則表達式的錨,由於它們將模式定位在目標字符串的特定位置上。最多見的錨元素是^,用來匹配字符串的開始,錨元素$用來匹配字符串的結尾。
任何正則表達式均可以做爲錨點條件,若是在符號」(?=」和」)」之間加入一個表達式,它就是一個先行斷言。用來講明圓括號內的表達式必須正確匹配。好比要匹配一個程序設計語言的名字,但只在其後有冒號時才匹配,可使用/[jJ]ava([sS]cript)?(?=:)/。
帶有」(?!」和」)」的斷言是負向先行斷言。用以指定接下來的字符都不匹配。例如/Java(?!Script)([A-Z]w*)/,用來匹配Java後面跟一個大寫字母和任意個ASCII單詞,但Java後面不能跟隨」Script」。
修飾符用來講明高級匹配模式的規則。JavaScript支持3個修飾符:i、g和m。
i:修飾符」i」用以說明模式匹配是不區分大小寫的。
g:修飾符」g」用以說明模式匹配是全局的,也就是應該檢索出字符串中的全部匹配。
m:修飾符」m」用以說明在多行模式中執行匹配。在這種模式下,若是待檢索的字符串包含多行,那麼^和錨字符除了匹配整個字符串的開始和結尾以外,還可以匹配每行的開始和結尾。好比/java/im能夠匹配」Java」,也能夠匹配」java\nis fun」。
JavaScript的String類型支持4種使用正則表達式的方法。
search():接收一個參數(字符串類型或者是正則對象),返回值是stringObject 中第一個與 regexp 相匹配的子串的起始位置。
replace():replace() 方法用於在字符串中用一些字符替換另外一些字符,或替換一個與正則表達式匹配的子串。該方法接收兩個參數,第一個參數規定子字符串或要替換的模式的 RegExp 對象。第二個參數接收一個字符串值。規定了替換文本或生成替換文本的函數。若是正則表達式設置了修飾符g,那麼源字符串中全部與模式匹配的子字符串都將被替換。但replace()的功能遠不止單純的替換,正則表達式中可使用圓括號建立子表達式,正則表達式會記憶與每一個子表達式匹配的文本。若是在替換字符串中出現了$加數字,那麼replace()將與指定的子表達式相匹配的文原本替換。replace()的第二個參數能夠接收一個函數來動態計算替換字符串。
match():match()方法可在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。該方法相似 indexOf() 和 lastIndexOf(),可是它返回指定的值,而不是字符串的位置。若是設置了修飾符g,則返回全部匹配結果。沒有設置則只檢索第一個匹配。即便不是全局搜索,也會返回一個數組,這種狀況下,數組的第一個元素是匹配的字符串,餘下的是子表達式對應的字符串。參數傳入字符串至關於傳入了一個非全局的正則表達式。
split():split() 方法用於把一個字符串分割成字符串數組。語法是stringObject.split(separator,howmany),separator能夠是字符串或正則表達式,從該參數指定的地方分割 stringObject。howmany可選。該參數可指定返回的數組的最大長度。若是設置了該參數,返回的子串不會多於這個參數指定的數組。若是沒有設置該參數,整個字符串都會被分割,不考慮它的長度。
建立RegExp對象時接收兩個參數:正則字符串和修飾符。
//注意"\"須要使用"\\"進行表示 var zipcode = new RegExp("\\d{5}", g);
每一個RegExp對象都包含5個屬性。
source:是一個只讀字符串,包含正則表達式的文本。
global:用來講明這個正則表達式是否帶有修飾符g
ignoreCase:用來講明正則表達式是否帶有修飾符i
multiline:用來講明正則表達式是否帶有修飾符m
lastIndex:這是一個可讀寫的整數。若是匹配模式帶有g修飾符,這個屬性存儲整個字符串中下一次檢索的開始位置,這個屬性會被exec()和test()方法用到。
RegExp對象定義了兩個用於執行模式匹配的操做方法。
exec():exec()接收一個字符串參數,方法的做用就是在參數字符串中執行匹配檢索。若是它沒有找到匹配就返回true。但若是它找到了匹配,它將返回一個數組,這個數組的第一個元素包含的是與正則表達式相匹配的字符串,餘下的元素是與圓括號內的子表達式相匹配的子串。屬性index包含了發生匹配的字符串位置,屬性input引用的是正在執行檢索的字符串。exec()老是返回一個匹配結果,並提供本次匹配的全部相關信息。當調用exec()的正則表達式對象具備g修飾符時,它將把正則表達式對象的lastIndex屬性設置爲緊挨着匹配子串的字符位置。當再次調用exec()時,它將從字符串的lastIndex位置開始向後進行檢索。若是exec()沒有查詢到結果,它將把lastIndex設置爲0.
test():test()的運行機制和exec()一致,只不過它只返回true和false