如果對於正則基礎沒有太多瞭解的同學可以先看這篇文章: "初探正則表達式" 。 正則表達式是一個描述字元模式的對象, 的 類表示正則表達式, 和 都定義了方法,後者使用正則表達式進行強大的模式匹配和文本檢索於替換功能。 的正則表達式語法是 的正則表達式語法的子集。 JS中正則表達式的定義 JavaSc ...
如果對於正則基礎沒有太多瞭解的同學可以先看這篇文章:初探正則表達式。
正則表達式是一個描述字元模式的對象,JavaScript
的 RegExp
類表示正則表達式,String
和 RegExp
都定義了方法,後者使用正則表達式進行強大的模式匹配和文本檢索於替換功能。JavaScript
的正則表達式語法是 Perl5
的正則表達式語法的子集。
JS中正則表達式的定義
JavaScript 中的正則表達式用RegWxp對象表示,可以使用RegExp()構造函數來創建RegExp對象,不過RegExp對象更多的是通過一種特殊的直接量語法來創建。就像通過引號包裹字元的方式來定義字元串直接量一樣,正則表達式直接量定義為包含在一對斜杠(/)之間的字元,比如:
var someReg = /s$/
var someReg2 = new RegExp("s$")
其實,這兩個表達式是等價的,都匹配以字母s結尾的字元串,只不過第一個以直接量定義,第二個以正則表達式定義。
js中正則表達式的修飾符
修飾符 | 說明 |
---|---|
i | 執行不區分大小寫的匹配 |
g | 執行一個全局匹配,即找到所有匹配而不是找到一個就停止 |
m | 多行匹配模式 ^ 匹配一行的開頭和字元串的開頭 $ 匹配行的結束和字元串的結束 |
用於匹配模式的String方法
String
支持4種使用正則表達式的方法。
search()
:"JavaScript".search(/script/i);
search()
的參數是一個正則表達式,返回第一個與之匹配的字串的起始位置,如果到不到匹配的字串,它將返回 -1
,如果它的參數不是正則表達式,則首先會通過RegExp構造函數將他轉化成正則表達式,它不支持全局搜索,因為它忽略正則表達式中的修飾符 g
。上面的表達式將返回 4
。
replace()
:text.replace(/javascript/gi, "JavaScript");
replace()
用來執行檢索和替換操作。其中第一個參數是一個正則表達式,第二個參數是要進行替換操作的字元串。這個方法會對調用它的字元串進行檢索,使用指定的模式來匹配。如果 replace()
的第一個參數是一個字元串,那麼它將直接搜索這個字元串,而不是和 search()
一樣先通過 RegExp()
將它轉換成正則表達式。上面的表達式將文本中所有的 javascript
(不區分大小寫)統一替換為 JavaScript
。
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
對象還支持三個方法和一些屬性。
RegExp()
構造函數可以有兩個字元串參數,第一個參數包含正則表達式的主體部分。需要註意的是不管是字元串直接量還是正則表達式,都是用 \
作為轉義字元的首碼,因此當給構造函數傳入一個字元串表述的正則表達式時,必須要將 \
替換成 \\
。如果提供第二個參數,它就制定正則表達式的修飾符。
var thisReg = new RegExp("\\d{5}","g");
RegExp的屬性
source
: 只讀的字元串,包含正則表達式的文本。global
: 只讀的布爾值,說明這個正則表達式是否帶有修飾符g
。ignoreCase
: 只讀的布爾值,說明這個正則表達式是否帶有修飾符i
。multiline
: 只讀的布爾值,說明這個正則表達式是否帶有修飾符m
。lastIndex
: 可讀寫的整數,如果這個正則表達式帶有修飾符g
,這個屬性儲存在整個字元串中下次檢索的開始位置,這個屬性會被exec()
和test()
方法用到。
RegExp的方法
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()
一樣。
ES6中正則的擴展
RegExp構造函數
在ES5中,RegExp()
只能接受字元串作為參數,ES6允許其直接接受正則表達式作為參數。
let regex = new RegExp(/xyz/i)
字元串的正則方法
ES6中將字元串對象的4個正則方法在語言內部全部調用 RegExp
的實例方法,使得所有與正則有關的方法全部都定義在了 RegExp
對象上。
如 String.prototype.match
調用 RegExp.prototype[Symbol.match]
u修飾符
ES6對正則表達式增加了 u
修飾符,含義為“Unicode模式”,用來正確處理大於 \uFFFF
的Unicode字元。
y修飾符
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
sticky屬性
與 y
修飾符對應,ES6的正則對象對了 sticky
屬性,用來表示是否設置了 y
修飾符。
flags屬性
ES6為正則表達式新增了 flags
屬性,返回正則表達式的修飾符。