標籤:
知道Regex已經很久了,粗略會看懂一些,不過以前沒有系統的學習,最近在看《JS權威指南》,剛好看到了看到Regex部分,就比較系統的學習了Regex。
先說一下Regex的一些基本知識
定義
Regex直接量被定義在一對斜杠之間(/)
直接量字元(前面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)
該方法有一個參數,這個參數為Regex,如果不是Regex,也會用RegExp建構函式裝換為Regex。seach()不支援全域檢索,所以忽略標誌g
replace(regExp,String)
該方法第一個參數為Regex,第二個參數為要替換的字串。當有標誌g時第二個參數會替換全部與Regex匹配的子串,如果沒有標誌g,則替換第一個與模式比對的子串。如果第一個參數為字串,則直接檢索該字串。
$n表示第n個子串。String=<aaa><bbb>;var x=String.replace(regExp,"<$1><$1>");則x的值為<aaa><aaa>。
match(regExp)
當有標誌g時,該方法返回了包含匹配結果的數組。當沒有標誌g時,也是返回一個數組,array[1]則為第一個子串。
split(x)
把調用的字串分解為一個子串數組,分隔字元是參數,參數也可以使用Regex,如/\*,s\s*/,逗號左右有一個或多個空格
RegExp對象
建構函式RegExp(String,gim),第一個參數為Regex主體的字串,注意逸出字元的使用,第二個參數是Regex的標誌,可省略。
RegExp對象方法
regExp.exec(String);
該方法與match()方法很類似,但是,不管加不加標誌g,沒有找到匹配則返回null,如果找到,該方法只返回第一個匹配的字串。如果有加標誌g,第二次調用exec時則從regExp.lastIndex所指示的字元位置開始檢索,利用這個特點遍曆所有匹配,則可以達到match()加標誌g的結果,不過結果不像match()一樣返回一個數組。
regExp.test(String),如果字串包含Regex的一個匹配,則返回ture,當一個全域方法調用test()時,同樣regExp.lastIndex設定為匹配之後的字元的位置,這樣,test()方法也可以遍曆。
RegExp執行個體屬性(5個)
source 唯讀 Regex文本
global 唯讀布爾值 說明是否有標誌g
ignoreCase 唯讀布爾值 說明是否有標誌i
multiline 唯讀布爾值 說明是否有標誌m
lastIndex 可讀寫的整數
JavaScript Regex的入門與使用