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