第五節(jié)正則

----------------------------------正則的作用-------------------------------------------
正則:就是一個(gè)規(guī)則,用來(lái)處理字符串的一個(gè)規(guī)則(正則是用來(lái)處理字符串的)
處理:
 1>匹配  判斷一個(gè)字符串是否符合我們制定的規(guī)則
    var reg = /\d/;
    console.log(reg.test("張"));
    console.log(reg.test("張3"));

 2>捕獲  把字符串中符合我們正則規(guī)則的內(nèi)容捕獲到
    var reg = /\d/;
    console.log(reg.exec("張"));
    console.log(reg.exec("張3"));

創(chuàng)建一個(gè)正則  正則兩種創(chuàng)建方式是有區(qū)別的
    var reg=/\d/;
var reg=new RegExp("");

如何來(lái)學(xué)習(xí)正則贡未?
RegExp.prototype

----------------------------------正則的元字符和一些簡(jiǎn)單的應(yīng)用------------------------------------------
每一個(gè)正則表達(dá)式都是由元字符和修飾符組成的
元字符:在//之間具有意義的一些字符
  1俊卤、具有特殊意義的字符
    \:轉(zhuǎn)義字符消恍,轉(zhuǎn)譯后面字符所代表的含義
    ^:以某一個(gè)元字符開始
    $:以某一個(gè)元字符結(jié)尾
\n:匹配一個(gè)換行符
.:除了\n以外的任意字符
    x|y:x或者y中的一個(gè)
[xyz]:x或者y或者z中的一個(gè)字符
[^xyz]除了x y z以外的任意字符
[a-z]:a-z之間任意一個(gè)字符
[^a-z]:除了a-z之間的任何一個(gè)字符
    \d:0-9之間數(shù)字
    \D除了0-9之間的數(shù)字以外的任何字符
    \b:匹配一個(gè)邊界符   var str=”we  we  rrt   y”;
    \w:數(shù)字狠怨、字母佣赖、下劃線中的任意一個(gè)字符[(0-9)(a-z)(A-Z)(_)]
    \n換行
    \s:匹配一個(gè)空白符 空格....

   2、代表出現(xiàn)次數(shù)的量詞元字符
    *:出現(xiàn)0到多次
    +:出現(xiàn)1到多次 
    ?:出現(xiàn)零次或1次
    {n}出現(xiàn)n次
    {n,}出現(xiàn)n到多次
{n,m}出現(xiàn)n到m次

思考:
    var reg = /\d/;
    console.log(reg.test('fsdf3432'));

    var reg = /^\d$/;
    console.log(reg.test('0'));

    var reg = /^\d+$/;
    console.log(reg.test('44465'));

    var reg = /^0\.2$/;
console.log(reg.test('0.2'));

    var reg=/^[+-]$/;
console.log(reg.test('-'));

    驗(yàn)證簡(jiǎn)單的手機(jī)號(hào)
var reg = /^1\d{10}$/;

():分組:把一個(gè)大正則本身劃分為幾個(gè)小的正則
   var reg=/^(\d+)勿忘初心(\d+)$/;  (分成了兩組)
   console.log(reg.test('2017勿忘初心2017'));

[]:在中括號(hào)中出現(xiàn)的所有字符都是代表本身意思的字符
var reg=/^[.]$/;
console.log(reg.test(‘.’));
[]:不識(shí)別兩位數(shù)
var reg = /^[12]$/;代表的是1或者2中的一個(gè)
var reg = /^[\w-]$/;數(shù)字枢里、字母、下劃線豆胸、中劃線中的任意一個(gè)
var reg = /^[12-68]$/  (1巷疼、2-8中的一個(gè)嚼沿、8)三個(gè)中的一個(gè)

分組的作用:改變x|y的優(yōu)先級(jí)
var reg=18|19;//18 19 181 18 19 
var reg=(18|19); //18 19

思考:檢測(cè)是否為有效數(shù)字
1骡尽、可以出現(xiàn)小數(shù)點(diǎn)攀细,也可以不出現(xiàn)小數(shù)點(diǎn),但是出現(xiàn)小數(shù)點(diǎn)后面必須跟著一位或多位數(shù)字
2境钟、可以出現(xiàn)+或者-慨削,也可以不出現(xiàn)
3套媚、整數(shù)部分可以是一位整數(shù)凑阶,也可以是多位整數(shù),但是多位整數(shù)一定不能以0開頭
檢測(cè)是否為有效數(shù)字:var reg=/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;

-------------------------------------正則方式創(chuàng)建的區(qū)別--------------------------------------
創(chuàng)建正則的兩種方式
    var name = 'zhangsan';
    var reg = /^\d+"+name+"\d+$/;
    console.log(reg.test('123zhangsan234'));

    var reg2 = new RegExp('^\\d+' + name + '\\d+$');
    console.log(reg2.test('123zhangsan234'));
區(qū)別:字面量方式中出現(xiàn)的一切都是元字符姨俩,所以不能進(jìn)行變量值的拼接,而實(shí)例創(chuàng)建的方式是可以的
字面量方式中直接寫\d就可以调窍,而在實(shí)例中需要把它轉(zhuǎn)譯\\d
-------------------------------------------編寫簡(jiǎn)單的正則表達(dá)式--------------------------------------
1张遭、年齡介于18-65之間
var reg = /^(1[8-9]|[2-5]\d|6[0-5])$/;

2缔恳、驗(yàn)證郵箱(簡(jiǎn)版)
12324322@qq.com   2434432@163.com    zhang-23423_san@zhangsan.com
var reg=/^[\w.-]+@[0-9a-zA-Z]+(\.[a-zA-Z]{2,4}){1,2}$/;

3歉甚、驗(yàn)證身份證(簡(jiǎn)版)
var reg=/^\d{17}(\d|X)$/;

----------------------------------------懶惰性和貪婪性-----------------------------------------
正則捕獲:exec
思考:
    var reg=/\d+/;
    var str='zhangsan2015lisi2016';
    var res=reg.exec(str);
console.log(res);


每一次捕獲的時(shí)候都是先進(jìn)行默認(rèn)的匹配扑眉,如果沒(méi)有匹配成功的腰素,捕獲的結(jié)果是null弓千,只有有匹配的內(nèi)容我們才能捕獲到,而且捕獲到的內(nèi)容是一個(gè)數(shù)組

打印出來(lái)的結(jié)果捕獲的內(nèi)容格式:
1>捕獲到的內(nèi)容是一個(gè)數(shù)組
數(shù)組中的第一項(xiàng):是當(dāng)前大正則捕獲的內(nèi)容
Index:捕獲內(nèi)容在字符串中開始索引的位置
Input:捕獲的原始字符串



正則捕獲的特點(diǎn):懶惰性每一次執(zhí)行exec只捕獲第一個(gè)匹配的內(nèi)容,在不配合任何處理的情況下在執(zhí)行捌显,在執(zhí)行多次捕獲扶歪,捕獲的還是第一個(gè)匹配的內(nèi)容
lastIndex:是正則每一次捕獲在字符串中開始查找的位置善镰,默認(rèn)值是0

如何解決懶惰性炫欺?在正則的末尾添加一個(gè)修飾符”g”
global(g):全局匹配
ignoreCase(i)忽略大小寫
multiline(m)多行匹配

自己編寫正則獲取正則捕獲的所有內(nèi)容(不要忘記加g)
原理:加了全局修飾符g品洛,正則每次捕獲結(jié)束后摩桶,下一次捕獲繼續(xù)查找硝清,一直找到null   
var reg = /\d+/g;
    var str = 'zhangsan2015lisi2016';
    var res = reg.exec(str);
    var arr=[];
    while(res){
        arr.push(res[0])
        res = reg.exec(str);
    }
console.log(arr); 

思考:
    var reg = /\d+/g;
    var str = 'zhangsan2015lisi2016';
    console.log(reg.exec(str));
貪婪性 正則每一次捕獲都是按照最長(zhǎng)的結(jié)果捕獲的芦拿,捕獲的是2015
解決貪婪性--->在量詞元字符后面添加一個(gè)?即可
蔗崎?在正則中有很多作用:
1>放在普通的元字符后面代表是出現(xiàn)0-1次數(shù)字侠坎,數(shù)字可能出現(xiàn)可能不出現(xiàn)
2>放在量詞元字符后面,取消捕獲時(shí)候的貪婪性

正則中提供了exec的方法番官,字符串中提供了match方法,也可以捕獲
  字符串中的match方法(和exec原理一樣门躯,就是執(zhí)行的次數(shù)不一樣)讶凉,把所有和正則匹配的字符都獲取到
    var reg = /\d+/g;
    var str = 'zhangsan2015lisi2016';
    var ary=str.match(reg);
    console.log(ary);
match雖然好用但是在分組捕獲的情況下懂讯,match只能捕獲到大正則匹配的內(nèi)容褐望,而對(duì)于小正則捕獲的內(nèi)容是無(wú)法獲取的




---------------------------分組捕獲-----------------------------------------
思考1:
    var reg = /^(\w)\1(\w)\2$/;
    var str='ffzz';
console.log(reg.test(str));

正則分組:
1瘫里、改變優(yōu)先級(jí)
2谨读、分組引用
   \2代表和第二個(gè)分組出現(xiàn)一模一樣的內(nèi)容
   \1代表和第一個(gè)分組出現(xiàn)一模一樣的內(nèi)容
3劳殖、分組捕獲--->正則在捕獲的時(shí)候,不僅僅把大正則匹配的內(nèi)容捕獲到闷尿,而且還可以把小分組匹配的內(nèi)容捕獲到
(?:)在分組中?:的意思是只匹配不捕獲
var reg = /^(\d)(\d)$/;可以捕獲到1塑径、3
var reg = /^(\d)(?:\d)$/;只能捕獲到1
console.log(reg.exec(‘13’)); 
如果都是正則都是分組這中情況下:match()和exec()捕獲到的結(jié)果是一樣的

以下案例就是math和exec的不一樣的情況
    var reg = /zhangsan(\d+)/g;
    var str='zhangsan123zhangsan456zhangsan789';
    console.log(reg.exec(str));
    console.log(reg.exec(str));
    console.log(reg.exec(str));
console.log(str.match(reg));
exec執(zhí)行三次,每一次執(zhí)行不僅僅把大正則的獲取到填具,而且可以獲取第一個(gè)分組匹配的內(nèi)容
math只能捕獲到大正則匹配的內(nèi)容

-------------------------------replace---------------------------------------------
    var str = 'zhangsan2016zhangsan2017';
    str = str.replace(/zhangsan/g, 'lisi');

    replace實(shí)現(xiàn)的原理是:首先和exec捕獲一樣统舀,把所有和我們正則匹配的都捕獲到,然后把捕獲的內(nèi)容替換成我們需要替換的新內(nèi)容
    第一個(gè)值是正則
    第二個(gè)參數(shù)替換成一個(gè)函數(shù)
    1>匿名函數(shù)執(zhí)行多少次劳景,取決于正則能在字符串中捕獲多少次--->正則捕獲兩次誉简,所以我們的匿名函數(shù)也執(zhí)行兩次
    2>每次執(zhí)行的匿名函數(shù),里面?zhèn)鬟f的參數(shù)值arguments和我們自己通過(guò)exec捕獲到的結(jié)果是一樣的(即使有分組我們也可以通過(guò)arguments獲取到分組捕獲的內(nèi)容)
3> return返回的結(jié)果是啥盟广,就相當(dāng)于把當(dāng)前這一次大正則捕獲的內(nèi)容替換成你返回的內(nèi)容
思考1:
    str = str.replace(/zhangsan/g, function () {
        console.log(arguments);
        return 'lisi';
    });
   console.log(str);

思考2:
    var str = 'zhangsan2015zhangsan2016';
    str = str.replace(/(\d+)/g, function () {
         console.log(arguments[1]);
//arguments[0]大正則捕獲的內(nèi)容闷串,arguments[1]正則捕獲到的第一個(gè)分組(小正則)的內(nèi)容
         return 'aaa';
});

思考3:20132014替換成二零一三二零一四
    var str = '20132014';
    var ary = ["零", "一", "二", "三", "四"];
    str = str.replace(/\d/g, function () {
        return ary[arguments[0]];
    });
console.log(str);

總結(jié):
replace:將原有的字符替換成我們的新的字符
1> 在不使用正則的情況下,執(zhí)行一次replace只能替換字符串中的一個(gè)
2>replace是支持正則的筋量,在replace中我們可以一次批量的把所有正則匹配的內(nèi)容都替換掉

原理:先按照正則制定的規(guī)則呀酸,到我們字符串中把正則匹配的內(nèi)容捕獲到,然后在每一次捕獲之后纫雁,都把捕獲的內(nèi)容替換成新的內(nèi)容
1>我們的正則表達(dá)式捕獲到幾次闲勺,對(duì)應(yīng)的function就要執(zhí)行幾次
2>每一次執(zhí)行function的時(shí)候我們都可以獲取我們捕獲的內(nèi)容----->和我們單獨(dú)執(zhí)行一次exec的內(nèi)容一致
arguments[0]---->exec捕獲數(shù)組的第一項(xiàng)---->大正則捕獲的內(nèi)容
arguments[1]---->exec捕獲數(shù)組的index----->開始捕獲的索引
arguments[2]---->exec捕獲數(shù)組的input------>捕獲的原始字符串
不僅如此申尤,我們小分組捕獲的內(nèi)容也同樣可以獲取到橙喘。
3>我們的function中,通過(guò)return來(lái)返回我們要替換的內(nèi)容--->return是啥就把大正則捕獲的內(nèi)容進(jìn)行替換
  不寫return,默認(rèn)是用undefined來(lái)進(jìn)行替換的
  如果不想實(shí)現(xiàn)替換的話半沽,捕獲的內(nèi)容是啥,我們就返回啥------>return argument[0]




案例1:將小寫數(shù)字替換成大寫數(shù)字
    var str = '這周我走了3600步';
    var ary = ["零", "一", "二", "三", "四", "五", "六"];
    str = str.replace(/\d/g, function () {
        return ary[arguments[0]];
    });
console.log(str);

案例2:var str = 'zhangaaaaa';字符串中挑出出現(xiàn)頻率最高的字符和出現(xiàn)了多少次
var obj = {};
1重挑、獲取每一個(gè)字符出現(xiàn)的次數(shù)存放到了obj中
    str = str.replace(/[a-z]/gi, function () {
        var val = arguments[0];
        if (obj[val] >= 1) {
            obj[val] += 1;
        } else {
            obj[val] = 1;
        }
    });
    2严肪、出現(xiàn)最多的次數(shù)
    var max = 0;
    for (var key in obj) {
        if (max < obj[key]) {
            max = obj[key];
        }
    }
    3、把最大次數(shù)對(duì)應(yīng)的key值放到數(shù)組中
    var ary = [];
    for (var key in obj) {
        if (obj[key] == max) {
            ary.push(key);
        }
    }
  console.log(ary.toString()+'出現(xiàn)了'+max+'次數(shù)');
:案例3:
var str = "my name is {0},my age is {1},i come from {2},i love {3}";
var ary = ["小紅", 18, "中國(guó)", "吃飯"];
把{0}{1}{2}{3}分別替換成"小紅", 18, "中國(guó)", "吃飯"
str = str.replace(/{(\d+)}/g, function () {
        return ary[arguments[1]];
});




案例4:
    將var str = "http://www.baidu.com/index.html?mid=1000&cid=13213&app=1.0";轉(zhuǎn)換為
    obj={
        mid:1000,
        cid:13213,
        app:1.0
    }
    答案:
    var reg = /([^?&=]+)=([^?&=]+)/g;
    var obj = {};
    str = str.replace(reg, function () {
        obj[arguments[1]] = arguments[2];
});

案例5 :字符串首字母大寫
    var str = "wo shi xiao hong";
    var reg = /\b([a-z])/g;
    str = str.replace(reg, function () {
        return arguments[1].toUpperCase();
    });
console.log(str);

案例6:將var str = "2010-8-22 13:10:00";袍患,轉(zhuǎn)換為2010年8月22日13時(shí)10分00秒




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筛璧,一起剝皮案震驚了整個(gè)濱河市座舍,隨后出現(xiàn)的幾起案子承二,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛹找,死亡現(xiàn)場(chǎng)離奇詭異彼硫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門剪芍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人峡继,你說(shuō)我怎么就攤上這事贮折〗翊” “怎么了作儿?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵策添,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仪媒,道長(zhǎng)谢鹊,這世上最難降的妖魔是什么求冷? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任官撼,我火速辦了婚禮掠哥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牵咙。我一直安慰自己吠谢,他們只是感情好刃麸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般把沼。 火紅的嫁衣襯著肌膚如雪啊易。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天饮睬,我揣著相機(jī)與錄音租谈,去河邊找鬼。 笑死捆愁,一個(gè)胖子當(dāng)著我的面吹牛割去,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昼丑,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呻逆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了菩帝?” 一聲冷哼從身側(cè)響起咖城,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呼奢,沒(méi)想到半個(gè)月后宜雀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡握础,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年辐董,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓候。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郎哭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菇存,到底是詐尸還是另有隱情夸研,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布依鸥,位于F島的核電站亥至,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贱迟。R本人自食惡果不足惜姐扮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衣吠。 院中可真熱鬧茶敏,春花似錦、人聲如沸缚俏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至恬惯,卻和暖如春向拆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酪耳。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工浓恳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碗暗。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓颈将,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親讹堤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吆鹤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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