正則基本知識

正則表達式

第一章:基本概念

概念:

正則表達式(regular expression)是一個描述字符模式的對象耍群,ECMAScript的RegExp 類表示正則表達式义桂,

而String和RegExp都定義了使用正則表達式進行強大的模式匹配和文本檢索與替換的函數(shù)。

正則表達式用于對字符串模式匹配及檢索替換蹈垢,是對字符串執(zhí)行模式匹配的強大工具慷吊。

作用:

  1. 提高用戶體驗
  2. 減輕服務(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"]                   
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末双谆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子席揽,更是在濱河造成了極大的恐慌顽馋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驹尼,死亡現(xiàn)場離奇詭異趣避,居然都是意外死亡,警方通過查閱死者的電腦和手機新翎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來住练,“玉大人地啰,你說我怎么就攤上這事〗补洌” “怎么了亏吝?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盏混。 經(jīng)常有香客問我蔚鸥,道長,這世上最難降的妖魔是什么许赃? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任止喷,我火速辦了婚禮,結(jié)果婚禮上混聊,老公的妹妹穿的比我還像新娘弹谁。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布预愤。 她就那樣靜靜地躺著沟于,像睡著了一般。 火紅的嫁衣襯著肌膚如雪植康。 梳的紋絲不亂的頭發(fā)上旷太,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音销睁,去河邊找鬼供璧。 笑死,一個胖子當(dāng)著我的面吹牛榄攀,可吹牛的內(nèi)容都是我干的嗜傅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼檩赢,長吁一口氣:“原來是場噩夢啊……” “哼吕嘀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贞瞒,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤偶房,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后军浆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棕洋,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年乒融,在試婚紗的時候發(fā)現(xiàn)自己被綠了掰盘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赞季,死狀恐怖愧捕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情申钩,我是刑警寧澤次绘,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站撒遣,受9級特大地震影響邮偎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜义黎,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一禾进、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轩缤,春花似錦命迈、人聲如沸贩绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淑倾。三九已至,卻和暖如春征椒,著一層夾襖步出監(jiān)牢的瞬間娇哆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工勃救, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碍讨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓蒙秒,卻偏偏與公主長得像勃黍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子覆获,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容