成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺入正則(二)

MRZYD / 2845人閱讀

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

with (javascript)

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

元字符

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

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

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

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

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

語義類元字符

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

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

replace

replace也屬于經(jīng)常使用的一個方法,在具體到和正則表達(dá)式一起使用時是: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é)果/第一個分組匹配值/第二個分組匹配值/第三個分組匹配值/匹配成功的第一個字符的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是沒有replaceAll的方法的,需要全局替換請在正在中設(shè)置全局屬性g;

match

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

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

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

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

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

var reg2 = /([a-zA-Z]d)+([u4e00-u9fa5])+/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í)行多次均只輸出每一個匹配完整正則的子字符串,同時也沒有index和input的屬性。
search

search方法返回的就是正則第一次匹配成功的開始位置,用法是stringObject.search(regexp);同時serch方法只需要匹配成功一次,不會重置laseIndex屬性,每次都從字符串起始位置開始搜索,也會忽略全局搜索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
多次搜索和是否全局均不會影響搜索結(jié)果

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

淺入正則(一)

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87120.html

相關(guān)文章

  • 淺入正則(一)

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

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

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

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

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

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

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

    csRyan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<