《javascript高級程序設計》筆記:正則表達式

高程書中對正則部分介紹的偏少,特別是元字符部分幾乎沒有介紹;我找了幾篇不錯的博客做爲收錄:
正則表達式30分鐘入門教程
正則表達式-理論基礎篇
正則表達式-基礎實戰篇
最全的經常使用正則表達式大全javascript

正則表達式的實例屬性

RegExp 的每一個實例都具備下列屬性,經過這些屬性能夠取得有關模式的各類信息。
global:布爾值,表示是否設置了 g 標誌。
ignoreCase:布爾值,表示是否設置了 i 標誌。
lastIndex:整數,表示開始搜索下一個匹配項的字符位置,從 0 算起。
multiline:布爾值,表示是否設置了 m 標誌。
source:正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回html

var pattern1 = /\[bc\]at/i;

alert(pattern1.global); //false
alert(pattern1.ignoreCase); //true
alert(pattern1.multiline); //false
alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"

var pattern2 = new RegExp("\\[bc\\]at", "i");

alert(pattern2.global); //false
alert(pattern2.ignoreCase); //true
alert(pattern2.multiline); //false
alert(pattern2.lastIndex); //0
alert(pattern2.source); //"\[bc\]at"

正則表達式的實例方法

test()方法【是否匹配】

基本語法:regular.test(string)
參數:regular 爲正則表達式;string 爲所要匹配的字符串
返回值:布爾值java

在模式與該參數匹配的狀況下返回 true;不然,返回 false。在只想知道目標字符串與某個模式是否匹配,但不須要知道其文本內容的狀況下,使用這個方法很是方便,所以,test()方法常常被用在 if 語句中正則表達式

// 檢測輸入字符是否爲漢字
/^[\u4e00-\u9fa5]{0,}$/.test('哈哈');    // true

// 校驗電話號碼
/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test('13365191314')

test()方法經常使用語校驗用戶輸入的內容是否符合規範segmentfault

exec()方法【捕獲組】

基本語法:regular.exec(string)
參數:regular 爲正則表達式;string 爲所要匹配的字符串
返回值:數組或null(未匹配成功時)數組

1.返回數組組成元素

先來個例子:函數

var result = /(\d+):(\w+)/.exec('1234:abcd');
console.log(result) // --> ["1234:abcd", "1234", "abcd"]

var result = /(\d+):(\w+)/.exec('呀!出錯了');
console.log(result) // --> null

上面能夠看到,匹配不到字符則返回null,匹配到則返回一個數組;那麼它的元素組成是怎麼樣的呢?.net

返回的數組的第一個元素是與整個正則匹配的文本,後面的組成項依次爲正則中的子表達式(組)
例子中的第一個子表達式爲(d+),對應的匹配值爲'1234';第二個字表達式爲(w+),對應的匹配值爲'abcd',所以返回的數組爲["1234:abcd", "1234", "abcd"]code

2.返回數組的詳細信息

仍是上面的例子:htm

var result = /(\d+):(\w+)/.exec('1234:abcd');
console.log(result); // --> ["1234:abcd", "1234", "abcd"]
console.log(result.input); // ---> "1234:abcd"
console.log(result.index); // ---> 0

從上面返回的數組結果可知,數組添加了兩個額外的屬性,分別是:index, input
index: 匹配文本的第一個字符的位置
input: 指輸入的總體的文本

3.exec()匹配注意點

執行exec函數時,儘管是全局匹配的正則表達式,可是exec方法只對指定的字符串進行一次匹配,
獲取字符串中第一個與正則表達式想匹配的內容,而且將匹配內容和子匹配的結果存儲到返回的數組中,例如:/d/g.exec('a22') ,返回的結果和上面的結果同樣: ["2"]

下面這個例子主要是全局捕獲和非全局捕獲的信息對比:

var text = "cat, bat";
var pattern1 = /.at/;

var matches = pattern1.exec(text);
alert(matches.index);        //0
alert(matches[0]);           //cat
alert(pattern1.lastIndex);   //0

matches = pattern1.exec(text); 
alert(matches.index); //0 
alert(matches[0]); //cat 
alert(pattern1.lastIndex); //0

var pattern2 = /.at/g;

var matches = pattern2.exec(text); 
alert(matches.index); //0 
alert(matches[0]); //cat 
alert(pattern2.lastIndex); //3

matches = pattern2.exec(text);
alert(matches.index);        //5
alert(matches[0]);           //bat
alert(pattern2.lastIndex);   //8

matches = pattern2.exec(text);
alert(matches); //null
alert(pattern2.lastIndex);//0

結論:1.同一正則表達式,在全局匹配模式下,每次實例的lastIndex屬性的值爲匹配文本最後一個字符的下一個位置2.當 exec() 再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置爲 0。

相關文章
相關標籤/搜索