創建正則表達式
js是通過RegExp類型來支持正則表達式的,主要有2種方式來創建正則表達式:
- 以字面量的形式來定義
- 使用RegExp構造函數。
這次做的筆記主要是寫字面量來表示,RegExp構造函數以後再補充。一般情況下字面量用的比較多,但是當正則需要傳參數的時候,必須要用RegExp的寫法(比如說在一個函數中,正則是一個傳進來的參數)
字面量表示
形如:
var express = /pattern/flags;
其中pattern是正則表達式
flags:g表示全局模式,即模式被應用於所有字符串;i表示不區分大小寫;m表示多行模式。
元字符
特別注意:模式中使用的所有的元字符都必須轉義。用\轉義。
元字符有:( { [ \ ^ $ | ? * + . ] } )
例如:
var str = /\[ab\]c/ //匹配第一個"[ab]c"
捕獲組/匹配子項
匹配子項:小括號()(小括號還有另外一個意思,分組操作)
可以把正則的整體叫做母親,然後把左邊第一個小括號裏面的正則,叫做這個母親的第一個子項(捕獲組)。第二個就是第二個子項(捕獲組)。。。。。。
例如:
var re = /(\d+)(-)/g;
在這裏”\d+”就是第一個捕獲組,“-”是第2個捕獲組
重點區分{}的含義,以及一些特定的符號
1.{} 量詞
{}在正則裏面表示的是量詞
- {n,m}表示前面的字符最少出現n次,最多出現m次。
- {n,}至少出現n次
- {n}真好出現n次
- + :其實是{1,}的簡寫
- ? : {0,1},至多1次
- * : {0,},至少0次
2.() 匹配子項,或者是分組操作
- 把正則的整體叫做(母親),然後把左邊第一個小括號裏面的正則,叫做這個母親的第一個子項(孩子)。第二個就是第二個子項。。。。。。
3.[] 字符類
- []在正則裏面表示的是字符類,也就是一組類似的元素,[]中括號裏面的整體代表一個字符。
4.特定的一些符號
- \s : 一個空格(包括Tab等空白符)
- \S : 非空格
- \d : 一個數字
- \D : 非數字
- \w : 一個字符 (字母,數字,下劃線_)
- \W : 非字符
- \b :獨立的部分,(起始,結束,空格),也就是匹配單詞邊界,注意在單詞邊界匹配的位置,單詞字符後面或前面不與另一個單詞字符直接相鄰。請注意,匹配的單詞邊界並不包含在匹配中。換句話說,匹配的單詞邊界的長度爲零。(不要與 [\b] 混淆。)
- \B : 非獨立部分,也就是非單詞邊界。匹配位置的上一個和下一個字符的類型是相同的:即必須同時是單詞,或必須同時是非單詞字符。字符串的開頭和結尾處被視爲非單詞字符。
例如:
var str = 'one two'
var re2 = /one\b/;
alert(re2.test(str));
/one\b/表示one後面不與另一個單詞字符直接相鄰
- . : 匹配任意字符
- : 表示一個區域範圍(從小到大)
- ^ : 如果在正則的最開始位置,代表起始的意思,如果是在[]表示排除
- $ : 如果在正則的最後位置,代表結束的意思
- | : 表示或者
- \數字 : 表示重複子項:\1 重複的第一個子項;\2 重複的第二個子項.
例如:
var str = 'onesssgsdoso'
var re2 = /(o)(s)\1/;
alert(re2.test(str));
/(o)(s)\1/ 這裏\1就是表示o
var str = '123231a443'
var re2 = /([0-9])(a)\1/;
alert(re2.test(str));
//結果是false
var str = '123231a143'
var re2 = /([0-9])(a)\1/;
alert(re2.test(str));
//結果是true
所以注意:子項是指匹配到的字符串。
方法
match()
match:正則去匹配字符串,如果匹配成功,就返回匹配成功的數組;如果不成功,返回null;
用法:字符串.match(正則)
例如:
var str = '12ss123s1d23632x';
var re = /\d\d+/g;//全局模式g:全部查找
alert(str.match(re));
結果是[12,123,23632]
注意:match()也可以用來匹配子項,匹配的子項放在返回數組的後幾項,不過這個前提是不加g,加了g就不會返回子項了。
例如:
var str = 'sdfsdfsdfsddfs sd';
var re = /(s)(d)/;
alert(str.match(re));
結果是[sd,s,d]
但如果加了g
var str = 'sdfsdfsdfsddfs sd';
var re = /(s)(d)/g;
alert(str.match(re));
結果就是[sd,sd,sd,sd,sd]
test()
test:正則去匹配字符串,如果匹配成功,返回真,否則返回假;
用法:正則.test(字符串)
search()
serch:正則去匹配字符串,如果成功,返回字符串中第一個匹配項的索引;如果沒找到,則返回-1
用法:字符串.search(正則)。
注意這裏只返回第一個匹配項,不管有沒有g都是這樣。
replace()
replace:正則去匹配字符串,匹配成功的字符去替換成新的字符串;
用法:字符串.replace(正則,字符串);
注意它的第二個參數可以是字符串,也可以是個回調函數:
回調函數
注意函數的參數(注意順序):模式的匹配項,(第一個捕獲組的匹配項,第2個捕獲組的匹配,…),模式匹配項在字符串中的位置,原始的字符串。
這個回調函數應該返回一個字符串,表示被替換的匹配項。
例如:
var str = '2016-7-14';
var re1 = /(\d+)(-)/g;
str = str.replace(re1,function($0,$1,$2){
//第一個參數是母親,第2個參數是第2個孩子、、、、
alert($1);
return $1 + '.'
});
這段代碼中,$0就是2016-,7- ,而對應的$1是,2016,7,對應的$2是-,-