上文傳送門:初探正則表達式javascript
正則表達式是一個描述字符模式的對象,JavaScript
的 RegExp
類表示正則表達式,String
和 RegExp
都定義了方法,後者使用正則表達式進行強大的模式匹配和文本檢索於替換功能。JavaScript
的正則表達式語法是 Perl5
的正則表達式語法的子集。java
JavaScript 中的正則表達式用RegWxp對象表示,能夠使用RegExp()構造函數來建立RegExp對象,不過RegExp對象更多的是經過一種特殊的直接量語法來建立。就像經過引號包裹字符的方式來定義字符串直接量同樣,正則表達式直接量定義爲包含在一對斜槓(/)之間的字符,好比:正則表達式
var someReg = /s$/ var someReg2 = new RegExp("s$")
其實,這兩個表達式是等價的,都匹配以字母s結尾的字符串,只不過第一個以直接量定義,第二個以正則表達式定義。segmentfault
修飾符 | 說明 |
---|---|
i |
執行不區分大小寫的匹配 |
g |
執行一個全局匹配,即找到全部匹配而不是找到一個就中止 |
m |
多行匹配模式 ^ 匹配一行的開頭和字符串的開頭 $ 匹配行的結束和字符串的結束 |
String
支持4種使用正則表達式的方法。數組
search()
"JavaScript".search(/script/i);
函數
search()
的參數是一個正則表達式,返回第一個與之匹配的字串的起始位置,若是到不到匹配的字串,它將返回 -1
,若是它的參數不是正則表達式,則首先會經過RegExp構造函數將他轉化成正則表達式,它不支持全局搜索,由於它忽略正則表達式中的修飾符 g
。上面的表達式將返回 4
。this
replace()
text.replace(/javascript/gi, "JavaScript");
prototype
replace()
用來執行檢索和替換操做。其中第一個參數是一個正則表達式,第二個參數是要進行替換操做的字符串。這個方法會對調用它的字符串進行檢索,使用指定的模式來匹配。若是 replace()
的第一個參數是一個字符串,那麼它將直接搜索這個字符串,而不是和 search()
同樣先經過 RegExp()
將它轉換成正則表達式。上面的表達式將文本中全部的 javascript
(不區分大小寫)統一替換爲 JavaScript
。code
march()
:"1 and 2 and 3".match(/\d+g);
對象
match()
方法是最經常使用的String正則表達式方法。它惟一的參數就是一個正則表達式,返回的是一個匹配結果組成的數組。若是該表達式設置了修飾符 g
,則該方法反悔的數組中包括了字符串中全部匹配結果。若是這個這個正則表達式沒有設置修飾符 g
,它只檢索第一個匹配。可是即便它不是全局匹配,它也返回一個數組,在這種狀況下,數組的第一個元素就是匹配的字符串,剩下的元素則是正則表達式中用圓括號擴起來的子表達式。上面代碼返回 ["1","2","3"]
split()
"123,456,789".split(",");
這個方法將調用他的字符串拆分紅一個字串組成的數組,使用的分隔符是 split()
的參數,它的參數也能夠是一個正則表達式。上面的代碼返回 ["123","456","789"]
。
除了 RegExp()
構造函數之外,RegExp
對象還支持三個方法和一些屬性。
RegExp()
構造函數能夠有兩個字符串參數,第一個參數包含正則表達式的主體部分。須要注意的是無論是字符串直接量仍是正則表達式,都是用 \
做爲轉義字符的前綴,所以當給構造函數傳入一個字符串表述的正則表達式時,必需要將 \
替換成 \\
。若是提供第二個參數,它就制定正則表達式的修飾符。
var thisReg = new RegExp("\\d{5}","g");
source
: 只讀的字符串,包含正則表達式的文本。global
: 只讀的布爾值,說明這個正則表達式是否帶有修飾符 g
。ignoreCase
: 只讀的布爾值,說明這個正則表達式是否帶有修飾符 i
。multiline
: 只讀的布爾值,說明這個正則表達式是否帶有修飾符 m
。lastIndex
: 可讀寫的整數,若是這個正則表達式帶有修飾符 g
,這個屬性儲存在整個字符串中下次檢索的開始位置,這個屬性會被 exec()
和 test()
方法用到。RegExp
對象定義了兩個用於執行模式匹配操做的方法。
exec()
它與咱們以前介紹的 match()
類似,只是它的參數是一個字符串,而 match()
的參數是一個RegExp對象。
exec()
對一個指定的字符串執行匹配檢索。若是它沒有找點任何匹配,它就返回 null
,可是若是他找到一個匹配,它將返回一個數組,這個數組第一個元素包含的是與正則表達式相匹配的字符串,餘下的就是正則表達式括號內的子表達式。
和 match()
不一樣,無論正則表達式是否具備全局修飾符 g
,exec()
都會返回同樣的數組。當調用 exec()
的正則表達式對象具備修飾符 g
的時候,它把當前正則表達式的 lastindex
屬性設置爲緊挨着匹配字串的字符位置。當同一個字符串第二次調用 exec()
的時候,他將會從 lastIndex
所指示的字符位置開始檢索。若是沒有任何匹配結果,他將會把 lastIndex
設置爲 0
(咱們也能夠在任什麼時候候進行設置)。
test()
調用 test()
和調用 exec()
等價,當 exec()
的返回結果不是 null
的時候,test()
返回 true
。因爲這種等價性,當一個全局表達式調用 test()
時,它的行爲和 exec()
同樣。
在ES5中,RegExp()
只能接受字符串做爲參數,ES6容許其直接接受正則表達式做爲參數。
let regex = new RegExp(/xyz/i)
ES6中將字符串對象的4個正則方法在語言內部所有調用 RegExp
的實例方法,使得全部與正則有關的方法所有都定義在了 RegExp
對象上。
如 String.prototype.match
調用 RegExp.prototype[Symbol.match]
ES6對正則表達式增長了 u
修飾符,含義爲「Unicode模式」,用來正確處理大於 \uFFFF
的Unicode字符。
ES6還爲正則表達式添加了 y
修飾符。他的做用和 g
修飾符相似,也是全局匹配,後一次匹配都從上一次匹配成功的下一位置開始。不一樣之處在於,g
修飾符只要剩餘位置中存在匹配就行,而 y
修飾符會確保匹配從剩餘的第一個位置開始。g
修飾符會忽略非法字符, y
不會。
let s = "aaa_aa_a"; let r1 = /a+/g; let r2 = /a+/y; r1.exec(s) // ["aaa"] r2.exec(s) // ["aaa"] r1.exec(s) // ["aa"] r2.exec(s) // null
與 y
修飾符對應,ES6的正則對象對了 sticky
屬性,用來表示是否設置了 y
修飾符。
ES6爲正則表達式新增了 flags
屬性,返回正則表達式的修飾符。