JavaScript RegExp
RegExp 構(gòu)造函數(shù)創(chuàng)建了一個(gè)正則表達(dá)式對象,用于將文本與一個(gè)模式匹配。
RegExp 的實(shí)例用于生成一個(gè)正則表達(dá)式,利用正則表達(dá)式從字符串中匹配想要的內(nèi)容。
正則表達(dá)式不是 JavaScript 的一個(gè)子內(nèi)容,也并非 JavaScript 獨(dú)有,需要學(xué)習(xí)正則表達(dá)式可以查閱相對應(yīng)的文獻(xiàn)。
1. 創(chuàng)建實(shí)例
創(chuàng)建一個(gè) RegExp 實(shí)例,只需要將其當(dāng)作構(gòu)造函數(shù)使用:
var regexp = new RegExp(/^a*$/);
regexp.test('aaaa'); // true
regexp.test('a'); // true
regexp.test('a1'); // false
上面這個(gè)例子創(chuàng)建了一個(gè)規(guī)則為從開頭到結(jié)尾必須是任意個(gè)a
正則表達(dá)式。
注意上面的例子中實(shí)際上是把一個(gè)正則表達(dá)式字面量
作為參數(shù)傳遞給了 RegExp 構(gòu)造函數(shù)。
test
方法可以用來校驗(yàn)?zāi)硞€(gè)字符串能否使用這個(gè)正則表達(dá)式匹配到目標(biāo)。
如果不想傳遞字面量,也可以傳遞一個(gè)正則表達(dá)式字符串,這個(gè)時(shí)候不需要使用 /
包裹,而字面量是需要 /
包裹的。
var regexp = new RegExp('^a*$'); // 不需要使用 / 將表達(dá)式包裹起來
regexp.test('aaaa'); // true
regexp.test('a'); // true
regexp.test('a1'); // false
這樣創(chuàng)建出來的和傳遞正則表達(dá)式字面量的效果一樣。
傳遞字符串的時(shí)候還能傳遞第二個(gè)參數(shù),作為正則表達(dá)式的符號,部分文獻(xiàn)也稱其為描述符。
var regexp1 = new RegExp('^a*$', 'i');
var regexp2 = new RegExp('^a*$');
var str = 'AAAAA';
console.log(regexp1.test(str)); // 輸出:true
console.log(regexp2.test(str)); // 輸出:false
符號 i
表示忽略大小寫,所以 regexp2
無法在 str
中匹配到值。
如果需要多個(gè)符號,則將多個(gè)符號放在一起作為字符串即可。
var regexp = new RegExp('^a*$', 'igm');
2. 字面量
通常構(gòu)造函數(shù)會在不確定表達(dá)式的內(nèi)容情況下使用,預(yù)定義好的正則表達(dá)式通常都會用字面量來表示。
正則表達(dá)式的字面量使用一對 /
進(jìn)行包裹。
var regexp = /^a&/;
這里不需要引號進(jìn)行包裹,使用引號就變成了字符串。
如果需要加入符號,則跟在末尾即可。
var regexp1 = /^a*$/g;
var regexp2 = /^a*$/ig;
3. 符號
在 ES6 之前,有三種符號。
g
全局匹配,找到所有匹配,而不是在第一個(gè)匹配后停止
var regexp1 = /a/g;
var regexp2 = /a/;
var str = 'abcdeabcde';
console.log(str.match(regexp1)); // 匹配到兩個(gè) a
console.log(str.match(regexp2)); // 只匹配到一個(gè),并返回相應(yīng)信息
可以看到,regexp1
能匹配到兩個(gè) a。
i
忽略大小寫
var regexp1 = /apple/i;
var regexp2 = /apple/;
var str = 'AN APPLE A DAY KEEPS THE DOCTOR AWAY.';
console.log(str.match(regexp1)); // 可以找到一個(gè)
console.log(str.match(regexp2)); // 找不到 輸出:null
regexp2沒有忽略大小寫,所以是無法匹配到 apple
的。
m
多行匹配
多行匹配模式下,開頭和末尾就不是整個(gè)字符串的開頭和末尾了,而是一行的開頭和末尾。
目前 ES6 提供了三種新的描述符,分別為 u(Unicode 模式),y(粘連模式),s(dotAll 模式)。
4. 常用的正則表達(dá)式匯總
正則表達(dá)式不一定通用,可能需要結(jié)合業(yè)務(wù)的實(shí)際場景來做調(diào)整。
4.1 URL
/(http[s]?:\/\/)?[^\s(["<,>]*\.[^\s[",><]*/
4.2 純數(shù)字
/^[0-9]*$/
4.3 郵箱
/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
4.4 中文與全角符號
/[\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee]/
4.5 身份證(不驗(yàn)證是否合法)
/\d{15}(\d\d[0-9xX])?/
4.6 僅包含英文字母的字符串
/^[A-Za-z]+$/
4.7 正整數(shù)
/^\d+$/
4.8 負(fù)整數(shù)
/^((-\d+)|(0+))$/
4.9 數(shù)字(正負(fù)數(shù)、小數(shù))
/^(\-|\+)?\d+(\.\d+)?$/
4.10 IPv4
/^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$/
5. 小結(jié)
正則表達(dá)式字面量需要使用 /
包裹,通常字面量會用于寫死固定的正則表達(dá)式,如果需要動態(tài)生成,都會使用構(gòu)造函數(shù)的方式。