JavaScript正則表達式

正則表達式(Regular Expression)使用單個字符串來描述、匹配一系列符合某個句法規則的字符串搜索模式,是用於匹配字符串中字符組合的模式。css

 

1、JS 如何建立正則表達式?

 

  • 經過直接量定義(隱式建立

 

var str = 'I love js';
var pattern = /js/;
// test exec
console.log(pattern.test(str));     //true
console.log(pattern.exec(str));     //"js"
  • 經過構造函數定義(顯式建立

var str = 'I love js';
var pattern = new RegExp('js');
console.log(pattern.test(str));     //true
console.log(pattern.exec(str));     //"js"

 

2、正則表達式修飾符

  • i:執行對大小寫不敏感的匹配(ignoreCase
  • g:執行全局匹配(global
  • m:執行多行匹配(multiline

示例:html

//字面量
var pattern = /js/i;
//構造函數
var pattern = new RegExp('js', 'i');

 

3、正則表達式直接量字符

  • \o:NULL字符(\u0000正則表達式

  • \t:製表符,即Tab(\u0009數組

  • \n:換行符(\u000A函數

  • \v:垂直製表符(\u000B編碼

  • \f:換頁符(\u000Cspa

  • \r:回車符(\u000Dcode

  • \xnn:由十六進制數nn指定的拉丁字符,例如,\x0A等價於\nhtm

  • \uxxxx:由十六進制數xxxx指定的Unicode字符,例如\u0009等價於\t對象

  • \cX:控制字符^X,例如,\cJ等價於換行符\n

示例:

//字面量
var pattern = /\t/;
//構造函數(‘\’要翻倍)
var pattern = new RegExp('\\t');

 

4、正則表達式錨字符

  • ^:匹配字符串的開頭,在多行檢索中,匹配一行的開頭

  • $:匹配字符串的結尾,在多行檢索中,匹配一行的結尾

  • \b:匹配一個單詞的邊界([\b]匹配的是退格符)

  • \B:匹配非單詞邊界的位置

  • (?=p):零寬正向先行斷言,要求接下來的字符都與p匹配,但不能包括匹配p的那些字符

  • (?!p):零寬負向先行斷言,要求接下來的字符串不與p匹配

示例:

//字面量
var pattern = /[^js]/;
//構造函數
var pattern = new RegExp('[^js]');

 

5、正則表達式字符類

  • [...]:方括號內的任意字符

  • [^...]:不在方括號內的任意字符

  • [a-z]:匹配a-z中任意一個字符

  • [^a-z]:匹配除了a-z的任意一個字符

  • .:除換行符和其餘 Unicode 行終止符以外的任意字符

  • \w:任何 ASCII 字符組成的單詞,等價於[a-zA-Z0-9_]

  • \W:任何不是 ASCII 字符組成的單詞,等價於[^a-zA-Z0-9_]

  • \s:任何 Unicode 空白符

  • \S:任何非 Unicode 空白符的字符,注意\w和\S不一樣

  • \d:任何 ASCII 數字,等價於[0-9]

  • \D:除了 ASCII 數字以外的任何字符,等價於[^0-9]

  • [\b]:退格直接量(特例)

示例:

//字面量
var pattern = /[\u4e00-\u9fa5]/;    //漢字
//構造函數
var pattern = new RegExp('[\u4e00-\u9fa5]');

 

6、正則表達式重複

  • {n, m}:匹配前一項至少n次,但不能超過m次

  • {n, }:匹配前一項n次或者更屢次

  • {n}:匹配前一項n次

  • ?:匹配前一項0次或者1次,也就是說前一項是可選的,等價於{0, 1}

  • +:匹配前一項1次或屢次,等價於{1, }

  • *:匹配前一項0次或屢次,等價於{0, }

示例:

var str = 'aaab';
var pattern1 = /a+/;
console.log(pattern1.exec(str));    //"aaa"
var pattern2 = /a+?/;
console.log(pattern2.exec(str));    //"a"
var pattern3 = /a+b/;
console.log(pattern3.exec(str));    //"aaab"
var pattern4 = /a+?b/;
console.log(pattern4.exec(str));    //"aaab"

 

7、正則表達式選擇、分組和引用

  • |:選擇,匹配的是該符號左邊的子表達式或右邊的子表達式

  • (…):組合,將幾個項組合爲一個單元,這個單元可經過「*」、「+」、「?」和「|」等符號加以修飾,並且能夠記住和這個組相匹配的字符串以供此後的任何使用

  • (?: …):只組合,把項組合到一個單元,可是不記憶與改組相匹配的字符

  • \n:和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式(也有多是嵌套的),組索引是從左到右的左括號數,「(?:」形式的分組不編碼

示例:

var str = 'abcd';
var pattern1 = /(ab)c/;
console.log(pattern1.exec(str));    //"abc", "ab"
var pattern2 = /(?:ab)c/;
console.log(pattern2.exec(str));    //"abc"
var pattern3 = /(ab)(c)/;
console.log(pattern3.exec(str));    //"abc", "ab", "c"
var pattern4 = /(a(b(c)))/;
console.log(pattern4.exec(str));    //"abc", "abc", "bc", "c"

var str = 'ab cd ab';
var pattern5 = /(ab) cd \1/;
console.log(pattern5.exec(str));    //"ab cd ab", "ab"

 

8、用於模式匹配的String方法

  • search():它的參數是一個正則表達式,返回第一個與之匹配的子串的起始位置,若是沒有匹配的子串就返回-1。若是 search() 的參數不是正則表達式,則首先會經過 RegExp 構造函數將它轉換爲正則表達式,search() 不支持全局檢索,由於它忽略修飾符g。
  • 示例:
var str = 'html js js';
console.log(str.search('js'));    //5

var pattern = /js/g;
console.log(str.search(pattern));    //5

 

  • replace():它用來執行檢索與替換。接收兩個參數,第一個是正則表達式,第二個是要進行替換的字符串。正則表達式若是設置的修飾符g,則進行全局替換,不然只替換匹配的第一個子串。若是第一個參數不是正則表達式,則直接搜索該字符串,而不是將其轉換爲正則表達式。
    示例:
var str = 'I love js js';
console.log(str.replace('js', 'html'));    //I love html js

var pattern = /js/g;
console.log(str.replace(pattern, 'html'));    //I love html html

 

  • match():它的參數是一個正則表達式,若是不是則經過 RegExp 轉換,返回的是一個由匹配結果組成的數組。若是設置了修飾符g則進行全局匹配。
    示例:
var str = 'js js js';

var pattern = /(j)s/;
console.log(str.match(pattern));    //"js", "j"

var pattern = /(j)s/g;
console.log(str.match(pattern));    //"js", "js", "js"

 

  • split():這個方法用以將調用它的字符串拆分爲一個子串組成的數組,使用的分隔符是 split() 的參數,它的參數也能夠使一個正則表達式。
    示例:
var str = 'html,css,js';
console.log(str.split(','));    //"html", "css", "js"

var pattern = /,/g;
console.log(str.split(pattern));    //"html", "css", "js"

 

9、正則表達式RegExp對象

  • 每一個 RegExp 對象都有5個屬性:

  1. source 是一個只讀字符串,包含正則表達式的文本。
  2. global 是一個只讀布爾值,用以說明這個正則表達式是否帶有修飾符g。
  3. ignoreCase 是一個只讀布爾值,用以說明這個正則表達式是否帶有修飾符i。
  4. multiline 是一個只讀布爾值,用以說明這個正則表達式是否帶有修飾符m。
    示例:
var str = 'js js js';
var pattern = new RegExp('\\b', 'i');
console.log(pattern.ignoreCase);   //true
console.log(pattern.global);       //false
console.log(pattern.multiline);    //false
console.log(pattern.source);       //\b
console.log(pattern.lastIndex);    //0
  1. lastIndex 是一個可讀可寫的整數,若是匹配模式帶有g修飾符,這個屬性存儲整個字符串中下一次檢索的開始位置。
    示例:
var str = 'js js js';
var pattern = /js/;
console.log(pattern.lastIndex);    //0
pattern.test(str);
console.log(pattern.lastIndex);    //0
pattern.test(str);
console.log(pattern.lastIndex);    //0
pattern.test(str);
console.log(pattern.lastIndex);    //0
pattern.test(str);
console.log(pattern.lastIndex);    //0
pattern.test(str);
console.log(pattern.lastIndex);    //0

var str = 'js js js';
var pattern = /js/g;
console.log(pattern.lastIndex);    //0
pattern.test(str);
console.log(pattern.lastIndex);    //2
pattern.test(str);
console.log(pattern.lastIndex);    //5
pattern.test(str);
console.log(pattern.lastIndex);    //8
pattern.test(str);
console.log(pattern.lastIndex);    //0
pattern.test(str);
console.log(pattern.lastIndex);    //2

 

  • RegExp對象有兩個方法:

  1. exec():參數是一個字符串,功能與 match()類似,exec() 方法對一個指定的字符串執行一個正則表達式,也就是在一個字符串中執行匹配檢索。若是沒有找到任何匹配就返回 null,找到了匹配就返回一個數組,這個數組的第一個元素包含的是與正則表達式相匹配的字符串,餘下的元素是與圓括號內的子表達式相匹配的子串,不論正則表達式是否有修飾符g,都會返回同樣的數組。當調用 exec() 的正則表達式對象具備修飾符g時,它將把當前正則表達式對象的 lastIndex 屬性設置爲緊挨着匹配子串的字符位置。當同一個正則表達式第二次調用 exec()時,它將從 lastIndex 屬性所指示的字符串處開始檢索,若是 exec() 沒有發現任何匹配結果,它會將 lastIndex 重置爲0。
    示例:
var str = 'I love js';
var pattern = /js/;
console.log(pattern.exec(str));     //"js"

 

  1. test():參數是一個字符串,用 test() 對某個字符串進行檢查,若是包含正則表達式的一個匹配結果,則返回 true 不然返回 false。
    示例:
var str = 'I love js';
var pattern = /js/;
console.log(pattern.test(str));     //true

 

  • 最後附上常見的正則表達式
/^[\u4e00-\u9fa5]{2,4}$/                   //姓名
/^\d{17}[0-9x]$/                           //身份證號
/^\w+@\w+.[a-zA-Z]{2,3}(.[a-zA-Z]{2,3})?$/ //郵箱
/^\d{11}$/                                 //手機號
相關文章
相關標籤/搜索