国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

淺入正則(二)

MRZYD / 2837人閱讀

摘要:前一篇淺入正則一了解了實(shí)例化一個(gè)對(duì)象的原型方法的對(duì)象屬性這些基礎(chǔ),大致知道正則怎么用,這一篇主要想了解一下正則怎么寫(xiě)。

with (javascript)

前一篇淺入正則(一)了解了實(shí)例化一個(gè)RegExp對(duì)象、RegExp的原型方法、RegExp的對(duì)象屬性這些基礎(chǔ),大致知道正則怎么用,這一篇主要想了解一下正則怎么寫(xiě)。

元字符

元字符表隨便就查得到,但這是會(huì)寫(xiě)正則最重要的基礎(chǔ),這里簡(jiǎn)單分成兩類(lèi)并按我的理解簡(jiǎn)單注釋。

運(yùn)算符 & 限定符

{
    "": "除語(yǔ)義類(lèi)元字符中的使用, 為轉(zhuǎn)義字符,比如想要匹配一個(gè)"(",直接使用"("會(huì)被認(rèn)作分組的開(kāi)始,需要使用轉(zhuǎn)義, "/(/"",
    "^": {
        "開(kāi)頭": "在非"[]"中使用,表示匹配開(kāi)頭的意思,如果RegExp對(duì)象設(shè)置多行(m)屬性,也會(huì)匹配換行符
及
之后的位置",
        "非": "在"[]"中,表示取反,例如:"/[^a]/",表示匹配不是a的字符"
    },
    "$": "匹配結(jié)束的位置,如果RegExp對(duì)象設(shè)置多行(m)屬性,也會(huì)匹配換行符
及
之前的位置",
    "*": "任意的意思,表示匹配前面緊接著的子表達(dá)式0次或多次",
    "+": "表示匹配前面緊接著的子表達(dá)式1次或多次,也就是最少1次",
    "?": {
        1: "表示匹配前面緊接著的子表達(dá)式0次或1次,也就是最多1次",
        2: "非貪婪模式:前提是緊跟在其他限定符后面,比如"*"、"+"、"{n,m}"等,表示盡可能少的匹配,比如"{n,m}",例如: "/d{4,6}?/g",假如使用這個(gè)正則test一段字符串"123456abc",則會(huì)盡可能少的匹配,也就是每次test只匹配4個(gè),然后lastIndex被置為4,默認(rèn)情況下為貪婪模式,每次會(huì)匹配6個(gè),lastIndex會(huì)重置為6,如果無(wú)法匹配6個(gè)才會(huì)嘗試匹配5個(gè),4個(gè)"
    },
    "{n}": "表示匹配前面緊接著的子表達(dá)式n次,n為非負(fù)整數(shù)",
    "{n,}": "表示匹配前面緊接著的子表達(dá)式n次或更多次,也就是最少n次,n為非負(fù)整數(shù)",
    "{n,m}": "表示匹配前面緊接著的子表達(dá)式n次到m次,也就是最少匹配n次,最多匹配m次,n <= m 且n和m均為非負(fù)整數(shù)",
    ".": "除"
"外的任意字符",
    "|": "或,例如"/a|bcd/"可以匹配"a"或者"bcd","/(a|b)cd/"可以匹配"acd"或者"bcd"",
    "-": "僅當(dāng)在"[]"中可以表示連接符,"/[a-z]/"、"/A-Z/"、"/0-9/"分別表示a到z、A到Z、0到9,其他時(shí)間就表示中劃線",
    "[]": "字符集合,表示中括號(hào)中的任意字符,比如"/[acb123ABC]/"表示匹配到"acb123ABC"中任意一個(gè)就可以",
    "()": "分組,和我們平常的加減運(yùn)算中的()差不多,可以理解為確定優(yōu)先級(jí)的意思,不過(guò)js正則中的()分組可以通過(guò)"$1 - $9"獲取匹配結(jié)果中,每一個(gè)分組對(duì)應(yīng)的匹配值,也就是"$1"也就是第一個(gè)分組的子表達(dá)式匹配成功的結(jié)果,例如:"abc123ef".replace(/(w)(d){3}/g,"$2$1"),例子中,匹配(一個(gè)字母)緊接著(一個(gè)數(shù)字)循環(huán)了三次,"$1"就是后面緊接著數(shù)字的一個(gè)字母,也就是"c","$2"就是一個(gè)數(shù)字,也就是"(d)"的最后一個(gè)匹配結(jié)果"3",因?yàn)閿?shù)字循環(huán)了三次,所以三個(gè)數(shù)字會(huì)被替換成"$1",而c會(huì)被替換成"$2",結(jié)果就是"ab3cef"",
    "(?:)": "和()差不多一個(gè)意思,只是()中的分組內(nèi)容不會(huì)被存儲(chǔ)到"$1 - $9"的集合中",
    "(?=)": "正向前瞻,也就是前面的表達(dá)式緊接著的表達(dá)式,要符合(?=)的=后面跟著的表達(dá)式,例如:"/[a-z](?=d)/",只會(huì)匹配后面緊接著數(shù)字的小寫(xiě)字母,但是數(shù)字并不會(huì)出現(xiàn)在匹配結(jié)果中且不會(huì)被存儲(chǔ)到"$1 - $9"的集合中",
    "(?!)": "負(fù)向前瞻,也就是前面的表達(dá)式緊接著的表達(dá)式,要符合(?!)的 != 后面跟著的表達(dá)式,例如:"/[a-z](?!d)/",只會(huì)匹配后面緊接著不是數(shù)字的小寫(xiě)字母,但是數(shù)字并不會(huì)出現(xiàn)在匹配結(jié)果中且不會(huì)被存儲(chǔ)到"$1 - $9"的集合中"
}

基礎(chǔ)的運(yùn)算符和限定符無(wú)非就這幾個(gè),說(shuō)到運(yùn)算符就有優(yōu)先級(jí),上面的運(yùn)算符的優(yōu)先級(jí)為:

{
    "一級(jí)": """",
    "二級(jí)": ""()"、"(?:)"、"(?=)"、"[]"",
    "三級(jí)": ""*"、"+"、"?"、"{n}"、"{n,}"、"{n,m}"",
    "四級(jí)": ""^"、"$"、"其他元字符及字符"",
    "五級(jí)": ""|"",
}

語(yǔ)義類(lèi)元字符

{
    "": "單詞邊界,也就是前面或者后面要跟著個(gè)空格",
    "B": "非單詞邊界,也就是必須在單詞中間,前后不能有空格",
    "d": "匹配一個(gè)數(shù)字字符,等價(jià)于"[0-9]"",
    "D": "匹配一個(gè)非數(shù)字字符,等價(jià)于"[^0-9]"",
    "w": "匹配任意單詞字符和下劃線"_",等價(jià)于"[a-zA-Z0-9_]"",
    "W": "匹配任意非單詞字符及非下劃線,等價(jià)于"[^a-zA-Z0-9_]"",
    "s": "匹配任意空白字符,含空格、制表符、換頁(yè)符等",
    "S": "匹配非空白字符",
    //···還有很多不常用的,用時(shí)再查吧
}

前一篇筆記只解析了RegExp對(duì)象的原型方法,但是對(duì)于正則表達(dá)式,一些字符串的方法同樣可以使用在正則上。

replace

replace也屬于經(jīng)常使用的一個(gè)方法,在具體到和正則表達(dá)式一起使用時(shí)是:stringObject.replace(RegExpObject,string|function),上例子:

var str1 = "2017-07-12";
var reg1 = /(d{4})-(d{2})-(d{2})/g;
str1.replace(reg1, function(a,b,c,d,e){
    // a/b/c/d/e分別代表: 匹配結(jié)果/第一個(gè)分組匹配值/第二個(gè)分組匹配值/第三個(gè)分組匹配值/匹配成功的第一個(gè)字符的index值
    console.log(a,b,c,d);                //2017-07-12 2017 07 12,0
    return c + "/" + d + "/" + b;
})
console.log(str1);                       //07/12/2017

需要注意的是,string是沒(méi)有replaceAll的方法的,需要全局替換請(qǐng)?jiān)谡谥性O(shè)置全局屬性g

match

math方法也是string的方法,match方法用法和exec很相似,同樣返回?cái)?shù)組。

非全局正則調(diào)用,輸出結(jié)果和exec相似,無(wú)匹配結(jié)果則返回null,有則返回?cái)?shù)組,分別存放每一個(gè)子表達(dá)式匹配的結(jié)果,同時(shí)具有index和input兩個(gè)屬性:

var reg1 = /([a-zA-Z]d)+([u4e00-u9fa5])+/;
//匹配 (大小寫(xiě)字母連著一個(gè)數(shù)字) 至少一次 (再連著漢字) 至少一次
var str1 = "a11B2老cd3李e45好";
var result = str1.match(reg1);
console.log(result);                     //["B2老", "B2", "老"]

這個(gè)結(jié)果和exec的結(jié)果完全一樣;

全局正則調(diào)用,數(shù)組只存放所有匹配的整個(gè)正則的子字符串,而不存放正則子表達(dá)式匹配的子字符串,也沒(méi)有index和input的屬性:

var reg2 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g;

//匹配 (大小寫(xiě)字母連著一個(gè)數(shù)字) 至少一次 (再連著漢字) 至少一次
var str2 = "a11B2老cd3李e45好";
var result1 = str2.match(reg2);
var result2 = str2.match(reg2);
var result3 = str2.match(reg2);

console.log(result1,result2,result3);                //["B2老", "d3李"] ["B2老", "d3李"] ["B2老", "d3李"]
console.log(result1.index,result2.input,result3);    //undefined undefined ["B2老", "d3李"]
執(zhí)行多次均只輸出每一個(gè)匹配完整正則的子字符串,同時(shí)也沒(méi)有index和input的屬性。
search

search方法返回的就是正則第一次匹配成功的開(kāi)始位置,用法是stringObject.search(regexp);同時(shí)serch方法只需要匹配成功一次,不會(huì)重置laseIndex屬性,每次都從字符串起始位置開(kāi)始搜索,也會(huì)忽略全局搜索g

var reg3 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g;
var reg4 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g;
var str3 = "a11B2老cd3李e45好";
str3.search(reg3);        //3
str3.search(reg3);        //3
str3.search(reg4);        //3
str3.search(reg4);        //3
多次搜索和是否全局均不會(huì)影響搜索結(jié)果

不管多么復(fù)雜的正則,都是用本節(jié)中的元字符寫(xiě)出來(lái)的,而在復(fù)雜的正則,用法無(wú)非也就上節(jié)和這一節(jié)中所記錄的方法。關(guān)鍵在于常用才能熟練,深入才能理解。這兩節(jié)筆記只是淺入,在實(shí)踐中摸索實(shí)踐才能真的深入淺出,一起加油。

淺入正則(一)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87120.html

相關(guān)文章

  • 淺入正則(一)

    摘要:例在第行中,結(jié)果為,因?yàn)榈谒男兄械钠ヅ涑晒螅瑸椋簿褪窍乱淮问菑拈_(kāi)始匹配,所以匹配失敗,返回,并把置為淺入正則二字符的含義和使用 正則表達(dá)式一直作為我的痛點(diǎn),沒(méi)有系統(tǒng)的學(xué)習(xí)和了解,之前部門(mén)有本500多頁(yè)的書(shū)叫《精通正則表達(dá)式》,一直沒(méi)勇氣拿起來(lái)。到后來(lái)業(yè)務(wù)中需要正則的地方越來(lái)越多,不忍心老找人幫忙寫(xiě)正則了。找了資料先看著,至少自己先入個(gè)門(mén)。 with (javascript) 實(shí)例化...

    zhaofeihao 評(píng)論0 收藏0
  • js基礎(chǔ)常用知識(shí)點(diǎn)由淺入深整理篇

    摘要:因?yàn)橥粫r(shí)間,只能處理一個(gè)異步,這又牽扯到單線程問(wèn)題了。然后控制臺(tái)默默打印了個(gè)目前前端,異步主要為前后端交互以及定時(shí)器,僅僅說(shuō)前端,如果說(shuō)的話,還有文件讀取等其他的方面會(huì)異步。 此篇文章完全按照我個(gè)人理解去寫(xiě)。 1.何為JS 先說(shuō)說(shuō)js干啥的。不負(fù)責(zé)點(diǎn)說(shuō),js就是操作瀏覽器的。 有人可能說(shuō)nodeJS,nodeJS嚴(yán)格意義上只能說(shuō)是用的ES,因?yàn)樗麤](méi)有dom ,也沒(méi)有bom。 簡(jiǎn)單點(diǎn)說(shuō)...

    Zack 評(píng)論0 收藏0
  • 淺入深laravel教程附錄1:全局助手函數(shù)之字符串部分

    摘要:一靜態(tài)屬性緩存部分由于每次正則替換費(fèi)時(shí),所以有個(gè)動(dòng)物函數(shù),框架使用靜態(tài)屬性保存,提高效率的意思是大駝峰式,這個(gè)函數(shù)是將轉(zhuǎn)換成的意思駱駝,這個(gè)函數(shù)是小駝峰格式,第一個(gè)字母是小寫(xiě)字母轉(zhuǎn)換成的意思是蛇,很形象,整個(gè)身子都一樣粗,它只對(duì)中有大寫(xiě) 一:靜態(tài)屬性緩存部分 由于每次正則替換費(fèi)時(shí),所以有4個(gè)動(dòng)物函數(shù),框架使用靜態(tài)屬性保存,提高效率 01:Str::studly($value)studl...

    sushi 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)式編程

    摘要:函數(shù)式編程,一看這個(gè)詞,簡(jiǎn)直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語(yǔ)言的理解更加融會(huì)貫通一些。但從根本上來(lái)說(shuō),函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<