《JavaScript進階程式設計(第三版)》學習筆記
建立正規表達式的方式
- 以字面量的形式來定義
- 使用RegExp構造函數,接受兩個參數:要比對的字元串模式,可選的标志字元串
一、字面量的形式定義
RegExp類型支援正規表達式,文法格式為:
var exp = / pattern / flags;
pattern部分表示正規表達式,flags表示标志,可以包含一個或者多個,支援的标志如下:
- g (global) 模式将被應用于所有字元串
- i (case-insensitive) 忽略其中的大小寫
- m (multiline) 到達某一行文本末尾時,繼續查找下一行中是否存在比對元素
例如
//比對所有".at",不區分大小寫
var pattern = / \.at / gi;
二、RegExp構造函數
RegExp構造函數,接受兩個參數:要比對的字元串模式,可選的标志字元串
//比對第一個bat或者cat,不區分大小寫。兩種方法
var pattern1 = / [bc]at /i;
var pattern2 = new RegExp("[bc]at", "i");
由于RegExp構造函數的模式參數是字元串,是以在一些情況下需要進行雙重轉義。所有的元字元必須進行雙重轉義((, ), [, ], {, }, , ^, $, |, *, +, ., ?)
/**
第一個循環中,執行個體屬性不會重置,多次調用會失敗
第二個循環中,RegExp構造函數每次都會在循環中建立正規表達式,傳回為true
*/
var re = null;
var i;
for (i = ; i < ; i++){
re = / cat /g;
alert("字面量形式定義" + re.test("catastrophe"));
}
for (i = ; i < ; i++){
re = new RegExp("cat", "g");
alert("RegExp形式定義" + re.test("catastrophe"));
}
1.RegExp的執行個體屬性
通過這些屬性可以獲得有關模式的各種資訊
- global: boolean, 是否設定了g标志
- ignoreCase: boolean, 是否設定i标志
- lastIndex: int, 開始搜尋下一個比對項的字元位置
- multiline: boolean, 是否設定m标志
-
source: 正規表達式的字元串表示按照仔面了形式而非傳入函數的字元串模式傳回
(通過這些屬性可以獲知一個正規表達式的各方面資訊,然而用處不大)
function getAttr() {
var pattern1 = / \[bc\] at /i;
alert(pattern1.global);
alert(pattern1.ignoreCase);
alert(pattern1.multiline);
alert(pattern1.lastIndex);
alert(pattern1.source);
var pattern2 = new RegExp("\\[bc\\]at", "i");
alert(pattern2.global);
alert(pattern2.ignoreCase);
alert(pattern2.multiline);
alert(pattern2.lastIndex);
alert(pattern2.source);
}
2.RegExp的執行個體方法
主要方法是exec(),接受一個要應用模式的字元串的參數,傳回第一個比對項資訊的數組,沒有則傳回null。傳回的數組Array執行個體中,有兩個屬性:index(比對項在字元串中的位置)和input(應用正規表達式的字元串)
function getFunc() {
var text = "mom and dad and baby";
var pattern = /mom (and dad (and) ? baby)?/gi;
var matches = pattern.exec(text);
alert("index: " + matches.index);
alert("input: " + matches.input);
alert(matches[]); //幾重括号
alert(matches[]);
alert(matches[]);
}
全局标志與非全局标志
function getFuncGlobal() {
var text = "cat, bat, sat, fat";
//此處沒有設定全局标志g,始終傳回第一個比對項
var pattern1 = /.at/;
var matches = pattern1.exec(text);
alert("沒有全局标志,index: " + matches.index);
alert("沒有全局标志 " + matches[]);
alert("沒有全局标志,最後一位" + pattern1.lastIndex);
//此處設定全局标志g,依次傳回比對項
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
alert("有全局功能的index:" + matches.index);
alert("有全局功能" + matches[]);
alert("有全局功能" + pattern2.lastIndex);
matches = pattern2.exec(text);
alert("(下一個)有全局功能的index:" + matches.index);
alert("(下一個)有全局功能" + matches[]);
alert("(下一個)有全局功能" + pattern2.lastIndex);
}
正規表達式的第二個方法是test(),接受一個字元串參數,驗證是否比對
3.構造函數的屬性
可以通過兩種方式通路最新正規表達式的屬性,這些屬性有長屬性名和短屬性名之分。
function longAttr() {
var text = "this has been a short summer";
var pattern = /(.)hort/g;
//此處是長屬性名稱
if(pattern.test(text)){
alert("輸入" + RegExp.input);
alert("左邊内容" + RegExp.leftContext);
alert("右邊内容" + RegExp.rightContext);
alert("輸入最後一次比對" + RegExp.lastMatch);
alert("最近一次比對的捕獲組" + RegExp.lastParen);
}
}
function shortAttr() {
var text = "this has been a short summer";
var pattern = /(.)hort/g;
//短屬性名,通過[]通路
if (pattern.test(text)){
alert("輸入" + RegExp.$_);
alert("左邊" + RegExp["$`"]);
alert("右邊" + RegExp["$'"]);
alert("最後一次比對" + RegExp["$&"]);
alert("捕獲組" + RegExp["$+"]);
}
}