上文傳送門:初探正則表達式
正則表達式是一個形貌字符形式的對象,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種運用正則表達式的要領。
1. search()
"JavaScript".search(/script/i);
search()
的參數是一個正則表達式,返回第一個與之婚配的字串的肇端位置,假如到不到婚配的字串,它將返回 -1
,假如它的參數不是正則表達式,則起首會經由過程RegExp組織函數將他轉化成正則表達式,它不支撐全局搜刮,因為它疏忽正則表達式中的修飾符 g
。上面的表達式將返回 4
。
2. replace()
text.replace(/javascript/gi, "JavaScript");
replace()
用來實行檢索和替代操縱。个中第一個參數是一個正則表達式,第二個參數是要舉行替代操縱的字符串。這個要領會對挪用它的字符串舉行檢索,運用指定的形式來婚配。假如 replace()
的第一個參數是一個字符串,那末它將直接搜刮這個字符串,而不是和 search()
一樣先經由過程 RegExp()
將它轉換成正則表達式。上面的表達式將文本中一切的 javascript
(不辨別大小寫)一致替代為 JavaScript
。
3. march()
:
"1 and 2 and 3".match(/\d+g);
match()
要領是最經常使用的String正則表達式要領。它唯一的參數就是一個正則表達式,返回的是一個婚配效果構成的數組。假如該表達式設置了修飾符 g
,則該要領懺悔的數組中包括了字符串中一切婚配效果。假如這個這個正則表達式沒有設置修飾符 g
,它只檢索第一個婚配。然則縱然它不是全局婚配,它也返回一個數組,在這類情況下,數組的第一個元素就是婚配的字符串,剩下的元素則是正則表達式頂用圓括號擴起來的子表達式。上面代碼返回 ["1","2","3"]
4. 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
對象定義了兩個用於實行形式婚配操縱的要領。
1. exec()
它與我們之前引見的 match()
相似,只是它的參數是一個字符串,而 match()
的參數是一個RegExp對象。
exec()
對一個指定的字符串實行婚配檢索。假如它沒有找點任何婚配,它就返回 null
,然則假如他找到一個婚配,它將返回一個數組,這個數組第一個元素包括的是與正則表達式相婚配的字符串,餘下的就是正則表達式括號內的子表達式。
和 match()
差別,不論正則表達式是不是具有全局修飾符 g
,exec()
都邑返回一樣的數組。當挪用 exec()
的正則表達式對象具有修飾符 g
的時刻,它把當前正則表達式的 lastindex
屬性設置為緊挨着婚配字串的字符位置。當同一個字符串第二次挪用 exec()
的時刻,他將會從 lastIndex
所指導的字符位置最先檢索。假如沒有任何婚配效果,他將會把 lastIndex
設置為 0
(我們也能夠在任何時刻舉行設置)。
2. 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
屬性,返回正則表達式的修飾符。