亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

JavaScript 入門教程

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. 小結

正則表達式字面量需要使用 / 包裹,通常字面量會用于寫死固定的正則表達式,如果需要動態生成,都會使用構造函數的方式。