關(guān)于正則

--------------------------正則的作用--------------------------

正則:就是一個(gè)規(guī)則番捂,用來處理字符串的一個(gè)規(guī)則(正則是用來處理字符串的)

處理:

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("");

如何來學(xué)習(xí)正則挣柬?

RegExp.prototype

----------------------------------正則的元字符和一些簡單的應(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)證簡單的手機(jī)號

var reg = /^1\d{10}$/;

():分組:把一個(gè)大正則本身劃分為幾個(gè)小的正則

var reg=/^(\d+)勿忘初心(\d+)$/;? (分成了兩組)

console.log(reg.test('2017勿忘初心2017'));

[]:在中括號中出現(xiàn)的所有字符都是代表本身意思的字符

var reg=/^[.]$/;

console.log(reg.test(‘.’));

[]:不識別兩位數(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)先級

var reg=18|19;//18 19 181 18 19

var reg=(18|19); //18 19

思考:檢測是否為有效數(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開頭

檢測是否為有效數(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

-------------------------------------------編寫簡單的正則表達(dá)式--------------------------------------

1、年齡介于18-65之間

var reg = /^(1[8-9]|[2-5]\d|6[0-5])$/;

2愈捅、驗(yà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)證身份證(簡版)

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)的匹配,如果沒有匹配成功的蓝谨,捕獲的結(jié)果是null灌具,只有有匹配的內(nèi)容我們才能捕獲到,而且捕獲到的內(nèi)容是一個(gè)數(shù)組

打印出來的結(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));

貪婪性 正則每一次捕獲都是按照最長的結(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)容粪般,而對于小正則捕獲的內(nèi)容是無法獲取的

---------------------------分組捕獲-----------------------------------------

思考1:

var reg = /^(\w)\1(\w)\2$/;

var str='ffzz';

console.log(reg.test(str));

正則分組:

1、改變優(yōu)先級

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和我們自己通過exec捕獲到的結(jié)果是一樣的(即使有分組我們也可以通過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á)式捕獲到幾次,對應(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中,通過return來返回我們要替換的內(nèi)容--->return是啥就把大正則捕獲的內(nèi)容進(jìn)行替換

不寫return吊洼,默認(rèn)是用undefined來進(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ù)對應(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, "中國", "吃飯"];

把{0}{1}{2}{3}分別替換成"小紅", 18, "中國", "吃飯"

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)容合作請聯(lián)系作者
  • 序言:七十年代末区拳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子意乓,更是在濱河造成了極大的恐慌樱调,老刑警劉巖约素,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笆凌,居然都是意外死亡圣猎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門乞而,熙熙樓的掌柜王于貴愁眉苦臉地迎上來送悔,“玉大人,你說我怎么就攤上這事爪模∏菲。” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵屋灌,是天一觀的道長洁段。 經(jīng)常有香客問我,道長共郭,這世上最難降的妖魔是什么祠丝? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮除嘹,結(jié)果婚禮上写半,老公的妹妹穿的比我還像新娘。我一直安慰自己尉咕,他們只是感情好叠蝇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著年缎,像睡著了一般蟆肆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晦款,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天炎功,我揣著相機(jī)與錄音,去河邊找鬼缓溅。 笑死蛇损,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坛怪。 我是一名探鬼主播淤齐,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袜匿!你這毒婦竟也來了更啄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤居灯,失蹤者是張志新(化名)和其女友劉穎祭务,沒想到半個(gè)月后内狗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡义锥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年柳沙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拌倍。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赂鲤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柱恤,到底是詐尸還是另有隱情数初,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布梗顺,位于F島的核電站泡孩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荚守。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一练般、第九天 我趴在偏房一處隱蔽的房頂上張望矗漾。 院中可真熱鬧,春花似錦薄料、人聲如沸敞贡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誊役。三九已至,卻和暖如春谷市,著一層夾襖步出監(jiān)牢的瞬間蛔垢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工迫悠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹏漆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓创泄,卻偏偏與公主長得像艺玲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鞠抑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • 一饭聚、正則初體驗(yàn) 在軟件開發(fā)中,不管是Java搁拙、C#秒梳、JS法绵、OC....基本上都會(huì)接觸到正則,不過大多數(shù)人都對正則并...
    iceman_dev閱讀 2,661評論 9 28
  • 前言 作為一個(gè)程序員端幼,要出去裝逼礼烈,手中必備的技能就是正則表達(dá)式。程序員的正則表達(dá)式婆跑,醫(yī)生的處方和道士的鬼畫符此熬,都是...
    Layzimo閱讀 549評論 0 6
  • //正則:就是以個(gè)規(guī)則 用來處理字符串的一個(gè)規(guī)則 var reg =/\d/; reg.exec("1"); //...
    Kyle_kk閱讀 702評論 0 1
  • 正則 1.什么是正則:用來操作字符串的規(guī)則; 正則就是用來操作(校驗(yàn)滑进,捕獲)“字符串”的 1)校驗(yàn):返回布爾值 t...
    web前端ling閱讀 571評論 0 0
  • 1. 概念 正則表達(dá)式描述了一種字符串匹配的模式犀忱,可以用來檢查一個(gè)字符串是否含有某種子串、將匹配的子串做替換或者從...
    沈林生閱讀 23,927評論 0 2