正則表達式
第一章:基本概念
概念:
正則表達式(regular expression)是一個描述字符模式的對象耍群,ECMAScript的RegExp 類表示正則表達式义桂,
而String和RegExp都定義了使用正則表達式進行強大的模式匹配和文本檢索與替換的函數(shù)。
正則表達式用于對字符串模式匹配及檢索替換蹈垢,是對字符串執(zhí)行模式匹配的強大工具慷吊。
作用:
- 提高用戶體驗
- 減輕服務(wù)器的壓力
第二章:創(chuàng)建正則表達式
1.使用new來創(chuàng)建
var exp = new RegExp('box' , 'gi' );
第一個參數(shù)是字符串;
第二個參數(shù)可選模式修飾符
參數(shù) | 含義 |
---|---|
g | 全局匹配 |
i | 忽略大小寫 |
m | 多行匹配 |
2.使用字面量
var exp = /box/gi;
直接用2個 / ;
在倆個斜杠后加上模式修飾符曹抬;
倆種創(chuàng)建方式比較:
1.使用字面量方式創(chuàng)建用的更加廣泛;
2.當(dāng)要匹配的內(nèi)容是變量時,只能使用new來創(chuàng)建.
第三章:正則表達式的測試
1.test( )
正則表達式對象.test(字符串)
- 參數(shù):要匹配的字符串
- 返回值:匹配成功返回true溉瓶,失敗返回false
例1:
var exp = /Box/i;
var str = 'box' ;
alert(exp.test(str));
=> true 忽略大小寫 ;
例2:
var exp = /abc/g;
var str = 'abcab';
var res = exp.test(str);
console.log(res);
console.log(exp.test(str));
console.log(exp.test(str));
=> true //從第一個開始匹配,匹配到了abc 返回true;
=> false //由于開啟了全局匹配,所以從上次匹配之后的位置開始匹配(也就是從第二個a開始); 若沒有g(shù) 則每次都會從頭開始匹配
=> true //由于上次匹配是false并且已經(jīng)將字符串str查找完了,所以又從頭開始匹配
注:
? 開啟了全局匹配g后,正則表達式內(nèi)部有一個lastIndex的屬性,用以記錄下次開始查找的下標(biāo),保證其每次從lastIndex的位置開始查找
例3:
var exp = /abc/g; //同一正則表達式匹配不同字符串
var str1 = 'abc';
var str2 = 'abcab';
console.log(exp.test(str1));
console.log(exp.test(str2));
=> true; //從str1的0位開始匹配,匹配到了abc,返回true, 此時lastIndex為3
=> false; //從str2中l(wèi)astIndex的位置開始匹配,也就是從第二個a開始
例4:
var exp1 = /abc/g; //不同正則表達式匹配同一字符串
var exp2 = /abc/g;
var str = 'abc';
console.log(exp1.test(str));
console.log(exp2.test(str));
=> true; //從str1的0位開始匹配,匹配到了abc,返回true
=> true; //從str1的0位開始匹配,返回true
2.exec( )
exec(字符串):該方法為專門為捕獲組而設(shè)計的
- 參數(shù):要匹配的字符串
- 返回值:返回的是一個數(shù)組。如果不匹配則返回null
關(guān)于返回值數(shù)組的說明:
- 它確實是Array的實例堰酿。
- 但是這個數(shù)組有兩個額外的屬性:index和 input
- index:表示匹配的字符串在源字符串中的索引
- input:表示匹配的源字符串疾宏。
- 數(shù)組的第一項是與整個模式匹配的字符串,其他項是與模式中捕獲組匹配的字符串
- 如果沒有捕獲組触创,則數(shù)組中只有第一項坎藐。關(guān)于捕獲組的概念以后再說
例1:
var exp = /abc/gi;
var str = "aaabcccdabcAbcAdaBc";
var strNew = "";
while (strNew=exp.exec(str)){ //使用while循環(huán),將所有匹配到字符串輸出來
console.log(strNew[0]) //由于返回的是一個帶有很多屬性的數(shù)組,所以我們只要數(shù)組中的字符串,也就是索引為0.
}
第四章:正則表達式的規(guī)則
字符類:單個字母數(shù)字下劃線
. //匹配除換行符外的任意字符(當(dāng)點放在[]中是,沒有特殊意義)
var exp = /\d/g; // [0-9]
var exp = /\D/g; //[^0-9]
var exp = /\w/g; //[a-zA-Z0-9_];
var exp = /\W/g; //[^a-zA-Z0-9_];
字符類:空白字符
\0 匹配null 字符
\b 匹配退格字符
\n 匹配換行符
\r 匹配回車字符
\t 匹配制表符
\s 匹配空白字符哼绑、空格岩馍、制表符和換行符
\S 匹配非空白字符
元字符/元符號 匹配情況
^ 行首匹配
$ 行尾匹配
字符類:重復(fù)字符
元字符/元符號 匹配情況
? 例如(x?) 匹配0個或1 個x
* 例如(x*) 匹配0個或任意多個x
+ 例如(x+) 匹配至少一個x
(xyz)+ 匹配至少一個(xyz)
{m,n} 例如x{m,n} n>=次數(shù)>=m 匹配最少m個、最多n個x
{n} 匹配前一項n次
{n,} 匹配前一項n次抖韩,或者多次
1.[ ]
匹配[ ]內(nèi)的任意一個字符
var exp = /[abc]/gi; // []內(nèi)代表匹配其中的一個字符: a 或 b 或 c
var exp = /[a-zA-Z0-9_$]/g; //匹配26個大小寫字母,0-9數(shù)字,下劃線_ 美元符$ 中的任意一個;
var exp = /[^a-zA-Z]/g //匹配任意不在括號中的字符集中的字符;
[ ]也可以配合? * + {} 來使用; 如[a-z]+ 匹配至少一個[a-z]范圍內(nèi)的任意一個;
2. ^
倆種用法:
1.放在[ ] 內(nèi) 表示非
var exp = /[^a-zA-Z]/g //匹配任意不在括號中的字符集中的字符;
2.放在[ ] 外,表示行首匹配
var exp = /^\d/g; //規(guī)定行首必須是數(shù)字
var str = '123qq';
console.log(exp.test(str)); //行首為數(shù)字1,返回true;
console.log(exp.lastIndex); //此時lastIndex 為1
console.log(exp.test(str)); //從下標(biāo)為1的位置開始匹配,雖然下標(biāo)為1的位置是數(shù)字,但卻不是行首,返回false;
3. $
表示行尾匹配,用法與^ 相近
^ 和 $ 合用
var exp = /^\d\d$/g; //規(guī)定行首和行尾必須是數(shù)字
var str = '12';
var str2 = '123';
console.log(exp.test(str)); // true
console.log(exp.lastIndex); // 2
console.log(exp.test(str)); //false
console.log(exp.lastIndex); //0
console.log(exp.test(str)); //true
console.log(exp.test(str2)); //false //exp中規(guī)定了行首行尾為數(shù)字,中間無內(nèi)容
4. .
匹配除換行符外的任意字符(當(dāng)點放在[ ]中是蛀恩,沒有特殊意義)
var exp = /./g;
var str = 'a';
console.log(exp.test(str));
=> true
若想匹配它本身.
var exp = /\./g;
5. |
擇一匹配(管道符號) 表示或
var exp = /a|b/g;
var str = 'a';
console.log(exp.test(str));
=> true
數(shù)量詞的匹配:默認都是貪婪匹配
6. ?
匹配0個或者1個
7. *
匹配0個或者多個
var exp = /a*/g;
var str = 'aaaaa';
console.log(exp.test(str)); //true
console.log(exp.test(str)); //true
8. +
匹配1個或多個
var exp = /a+/g;
var str = 'aaaaa';
console.log(exp.test(str)); //true
console.log(exp.test(str)); //false
9. {n}
匹配n個,只能是n個
10. {n,}
匹配至少n個
11. {n,m}
匹配至少n個,最多m個
第五章:基本的正則表達式驗證
寫一個正在表達式,判斷手機號是否合法
var exp = /1[34578]\d{9}$/g;
var str = '13979318939';
console.log(exp.test(str));
=> true
寫一個正在表達式,判斷郵箱是否合法
var exp = /^\w{3,15}@[\w-]+\.(com|cn|net|org|edu|com\.cn)$/gi;
var str = '133_d@cn.com.cn';
console.log(exp.exec(str)[0]);
=> 133_d@cn.com.cn
寫一個正則表達式,判斷圖片的地址是否合法
var exp = /^(http|https):\/\/.+\.(jpg|jpeg|gif|png)$/gi;
var str = 'http://3323498dsfledf.png';
console.log(exp.exec(str)[0]);
=> http://3323498dsfledf.png
寫一個正則表達式,爬取一堆字符串中的所有圖片地址
var exp = /http:\/\/[^:]+\.(jpg|jpeg|gif|png)/gi;
寫一個正則表達式,將字符串中的重復(fù)去掉
var exp = /(.)\1+/gi;
var str = "aabbccdd";
console.log(str.replace(exp,'$1'));
=> abc
第六章:方法
1.search( )
str.search(exp);
檢索與正則表達式相匹配的第一個匹配項的索引茂浮。
返回值: 索引 ,沒有返回-1;
注:search( )不支持全局,每次調(diào)用總是從0開始查找.加不加g都一樣
2.match( )
str.match(exp);
把滿足正則表達式的所有字符串一起返回
返回值: 數(shù)組 ,沒有返回null;
var str = "abc134ABC244co9";
console.log(str.match(/\d+/gi)); //獲取str中的所有數(shù)字的數(shù)組
=> ["134","244","9"]
注:如果想獲取所有的滿足的,應(yīng)該使用全局g,使用全局的時候,分組的信息則拿不到
3.replace( )
str.replace(exp,newStr);
將正則表達式替換
返回值: 替換之后的字符串
var str = "123aaa244";
console.log(str.replace(/\d/gi,"")); //將str中的數(shù)字全部去掉
=> aaa
寫一個正則表達式,將字符串中的重復(fù)去掉
var exp = /(.)\1+/gi;
var str = "aabbccdd";
console.log(str.replace(exp,'$1'));
=> abc
4.split( )
str.split(exp,length);
length:可選參,切出來的數(shù)組的最大長度
使用split 拆分成字符串?dāng)?shù)組
返回替換之后的字符串
var str = "102dsfe00dfefsf55";
var exp = /\D+/gi; //用所有非數(shù)字來切割
console.log(str.split(exp));
=> ["102","00","55"]