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

資訊專欄INFORMATION COLUMN

淺入正則(二)

MRZYD / 2843人閱讀

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

with (javascript)

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

元字符

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

運算符 & 限定符

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

基礎的運算符和限定符無非就這幾個,說到運算符就有優先級,上面的運算符的優先級為:

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

語義類元字符

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

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

replace

replace也屬于經常使用的一個方法,在具體到和正則表達式一起使用時是: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分別代表: 匹配結果/第一個分組匹配值/第二個分組匹配值/第三個分組匹配值/匹配成功的第一個字符的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的方法的,需要全局替換請在正在中設置全局屬性g

match

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

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

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

這個結果和exec的結果完全一樣;

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

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

//匹配 (大小寫字母連著一個數字) 至少一次 (再連著漢字) 至少一次
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李"]
執行多次均只輸出每一個匹配完整正則的子字符串,同時也沒有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
多次搜索和是否全局均不會影響搜索結果

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

淺入正則(一)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87120.html

相關文章

  • 淺入正則(一)

    摘要:例在第行中,結果為,因為第四行中的匹配成功后,為,也就是下一次是從開始匹配,所以匹配失敗,返回,并把置為淺入正則二字符的含義和使用 正則表達式一直作為我的痛點,沒有系統的學習和了解,之前部門有本500多頁的書叫《精通正則表達式》,一直沒勇氣拿起來。到后來業務中需要正則的地方越來越多,不忍心老找人幫忙寫正則了。找了資料先看著,至少自己先入個門。 with (javascript) 實例化...

    zhaofeihao 評論0 收藏0
  • js基礎常用知識點由淺入深整理篇

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

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

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

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

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

    csRyan 評論0 收藏0

發表評論

0條評論

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