知道正則表達式已經很久了,粗略會看懂一些,不過以前沒有系統的學習,最近在看《JS權威指南》,剛好看到了看到正則表達式部分,就比較系統的學習了正則表達式。
先說一下正則表達式的一些基本知識
定義
正則表達式直接量被定義在一對斜杠之間(/)
直接量字符(前面7個感覺用的會比較多)
字母或數字(自身)
\o(NULL字符)
\n(換行符)
\t(制表符)
\v(垂直制表符)
\f(換頁符)
\r(回車)
\xnn(16進制數nn指定的拉丁字符)
\uxxxx(16進制數xxxx指定的Unicode字符)
\cX(控制字符^X)
字符類
[...](位於括號內的任意字符)
[^...](不位於括號內得任意字符)
.(除換行符和其他Unicode行終止符之外的任意字符)
\w([a-zA-Z0-9])
\W([^a-zA-Z0-9])
\s(任何Unicode空白符)
\S(任何非Unicode空白符,\w和\S不同)
\d([0-9])
\D([^0-9])
[\b](退格直接量)特例
重復字符
{n,m}(匹配前一項至少n次至多m次)
{n,}(匹配前一項至少n次或更多次)
{n}(匹配前一項恰好n次)
?(匹配前一項0次或1次,等價{0,1})
+(匹配前一項1次或多次,等價{1,})
*(匹配前一項0次或多次,等價{0,})
非貪婪重復
如/a+/匹配1個或多個a,/a+?/只匹配一個a(前者為貪婪的,后者為非貪婪的)
選擇、分組、引用
|(選擇符,/a|b/可以匹配a或者b)
(...)(組合,定義子模式,\1表示第一個帶括號的子表達式,嵌套的時候按左括號分/(['"])[^\1]*\1/當第一個為單引號就\1為單引號,其他同理)
(?:...)(只組合,不能用\1引用,即不記憶與該數組匹配的字符)
\n(與第n個分組第一次匹配的字符相匹配)
錨字符
^(匹配字符串開頭,多行檢索時匹配一行的開頭)
$(匹配字符串結尾,多行檢索時匹配一行的結尾)
\b(匹配一個詞語的邊界)
\B(匹配非詞語邊界)
(?=p)(正前向聲明,要求接下來的字符都與模式p匹配)
(?!p)(反前向聲明,要求接下來打得字符不與模式p匹配)
標記(在/符號外說明)
i(執行大小寫不敏感匹配)
g(執行全局匹配,即找到所有匹配)
m(多行匹配)
用於匹配模式的String方法
seach(regExp)
該方法有一個參數,這個參數為正則表達式,如果不是正則表達式,也會用RegExp構造函數裝換為正則表達式。seach()不支持全局檢索,所以忽略標志g
replace(regExp,String)
該方法第一個參數為正則表達式,第二個參數為要替換的字符串。當有標志g時第二個參數會替換全部與正則表達式匹配的子串,如果沒有標志g,則替換第一個與模式匹配的子串。如果第一個參數為字符串,則直接檢索該字符串。
$n表示第n個子串。String=<aaa><bbb>;var x=String.replace(regExp,"<$1><$1>");則x的值為<aaa><aaa>。
match(regExp)
當有標志g時,該方法返回了包含匹配結果的數組。當沒有標志g時,也是返回一個數組,array[1]則為第一個子串。
split(x)
把調用的字符串分解為一個子串數組,分隔符是參數,參數也可以使用正則表達式,如/\*,s\s*/,逗號左右有一個或多個空格
RegExp對象
構造函數RegExp(String,gim),第一個參數為正則表達式主體的字符串,注意轉義字符的使用,第二個參數是正則表達式的標志,可省略。
RegExp對象方法
regExp.exec(String);
該方法與match()方法很類似,但是,不管加不加標志g,沒有找到匹配則返回null,如果找到,該方法只返回第一個匹配的字符串。如果有加標志g,第二次調用exec時則從regExp.lastIndex所指示的字符位置開始檢索,利用這個特點遍歷所有匹配,則可以達到match()加標志g的結果,不過結果不像match()一樣返回一個數組。
regExp.test(String),如果字符串包含正則表達式的一個匹配,則返回ture,當一個全局方法調用test()時,同樣regExp.lastIndex設置為匹配之后的字符的位置,這樣,test()方法也可以遍歷。
RegExp實例屬性(5個)
source 只讀 正則表達式文本
global 只讀的布爾值 說明是否有標志g
ignoreCase 只讀的布爾值 說明是否有標志i
multiline 只讀的布爾值 說明是否有標志m
lastIndex 可讀寫的整數