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

資訊專欄INFORMATION COLUMN

JavaScript正則表達(dá)式總結(jié)

big_cat / 3570人閱讀

摘要:正則表達(dá)式一直是里比較難以掌握的點(diǎn)。在中創(chuàng)建正則的兩種方式使用字面量這就是正則表達(dá)式的字面量語法,表示正則表達(dá)式的模式,為正則表達(dá)式的標(biāo)志。字面量形式的正則表達(dá)式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習(xí)慣。

正則表達(dá)式一直是js里比較難以掌握的點(diǎn)。 看不懂,學(xué)不會(huì),記不住。 每次需要用到正則的時(shí)候,都需要再去查找資料。 今天花時(shí)間把正則的知識點(diǎn)總結(jié)下,希望能在理解的基礎(chǔ)上熟練掌握。

正則表達(dá)式的作用

正則表達(dá)式在字符串處理方面發(fā)揮著巨大的作用,掌握了它,就能針對某一特定模式的字符串或者批量對字符串進(jìn)行處理。 雖然各個(gè)編程語言對正則的支持不同,但是差異并不大。 這里只介紹js語言中正則的使用方法。

javascript對正則表達(dá)式的支持

先看一段代碼:

var formatPrice = function(price){
  return price.toString().replace(/B(?=(d{3})+$)/g, ",");
}

這個(gè)formatPrice函數(shù)將商品總價(jià)轉(zhuǎn)化為每三位以","分割的字符串,這是業(yè)務(wù)中常遇到的情況。 可以看到,通過使用正則,代碼變得相當(dāng)?shù)暮啙崱?/p> 在js中創(chuàng)建正則的兩種方式

使用字面量

/pattern/flags, 這就是正則表達(dá)式的字面量語法,pattern表示正則表達(dá)式的模式,flags為正則表達(dá)式的標(biāo)志。比如: /a[bc]d{2}$/gi
其中模式和標(biāo)志的知識將會(huì)在后面詳細(xì)介紹。
字面量形式的正則表達(dá)式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習(xí)慣。

使用構(gòu)造函數(shù)

除了使用字面量外,還可以使用構(gòu)造函數(shù)生成正則表達(dá)式。
new RegExp(pattern [, flags]), 比如:var reg= new RegExp("[a-zA-Z]+d$", "gi")
這里構(gòu)造函數(shù)的兩個(gè)參數(shù),第一個(gè)參數(shù)可以是字符串(es5及以前)或正則表達(dá)式(es6),第二個(gè)可選參數(shù)為字符串。
當(dāng)我們事前不能確定正則表達(dá)式的值時(shí),或者正則依賴第三方輸入來動(dòng)態(tài)生成正則時(shí),需要使用這種方式。
這里要注意的一點(diǎn)是:第一個(gè)參數(shù)為一個(gè)字符串時(shí),當(dāng)我們使用正則里的特殊字符,比如d等時(shí),需要對進(jìn)行轉(zhuǎn)義,也就是寫成d的形式,因?yàn)?b>在字符串里有特殊含義。

正則表達(dá)式的使用

由于正則的使用場景主要是字符串處理,所以字符串類提供了很多方法使用正則表達(dá)式。比如:

str.replace(regexp|substr, newSubStr|function)
str.search(regexp)
str.match(regexp)
str.split([separator[, limit]])

另外,正則表達(dá)式本身也提供了處理字符串的方法,比如:
regexObj.exec(str)
regexObj.test(str)

這些方法將再后面介紹

正則表達(dá)式的語法 flags - 標(biāo)識符

g - global,全局匹配,找到所有的匹配,而不是在第一個(gè)匹配后停止

i - ignoreCase 忽略大小寫

m - multiline 多行搜索,不使用"m"模式時(shí),整個(gè)字符串會(huì)被當(dāng)做一行,換行符也被當(dāng)做正則里的一個(gè)字符,使用"m"模式時(shí),字符串換行后的內(nèi)容會(huì)被當(dāng)做新的一行。

元字符

正則表達(dá)式有兩種基本字符類型組成:

原義字符 - 代表他們本身含義的字符

元字符 - 在正則表達(dá)式中有特殊含義的非字母字符

比如: . * + ? () [] {} ^ $ |

字符類

. - 匹配任意單個(gè)字符,行結(jié)束符除外

d - 匹配任意阿拉伯?dāng)?shù)字,相當(dāng)于[0-9]

D - 匹配任意一個(gè)不是阿拉伯?dāng)?shù)字的字符,相當(dāng)于1, 這里^用在[]中表示取反的意思。

w - 匹配任意阿拉伯字母,數(shù)字和下劃線, 相當(dāng)于[0-9a-zA-Z_]

W - 與w相反, 相當(dāng)于2

s - 匹配一個(gè)空白符,包括空格符,制表符,換行符,換頁符和其他空格字符。

S - 匹配一個(gè)非空白符,與上面相反

- 匹配一個(gè)水平制表符

- 匹配一個(gè)回車符

- 匹配一個(gè)換行符

v - 匹配一個(gè)垂直制表符

還有其他一些不常用的字符類,具體可查閱MDN文檔

字符集合

[abc] - 又叫字符組,表示匹配集合中的任意一個(gè)字符,可以用-來指定范圍

[^abc] - 反義字符組,匹配不是集合中字符的一個(gè)字符,可以用-來指定范圍

邊界

^ - 不使用在[]中時(shí),表示匹配輸入開始

$ - 匹配輸入結(jié)尾

 - 匹配零寬單詞邊界

B - 匹配零寬非單詞邊界,與上面b含義相反。

量詞

- 匹配0次或1次

+ - 匹配一次或多次

* - 匹配0次或多次

{n} - 匹配n次

{m,n} - 匹配最少m次,最多n次

{m,} - 匹配最少m次

貪婪模式和非貪婪模式

舉個(gè)例子, /d{3,6}/g,這樣一個(gè)正則表達(dá)式如果匹配字符串"234955033",是匹配3或4,5,6個(gè)數(shù)字呢?

js中正則表達(dá)式會(huì)默認(rèn)盡可能多的匹配,也就是匹配6個(gè)數(shù)字,即貪婪模式。

非貪婪模式則是讓正則表達(dá)式盡可能少的匹配,也就是只匹配3個(gè)數(shù)字,正則要使用非貪婪模式,只需要在量詞后面加上?即可。
下面一個(gè)例子:

"123456789".replace(/d{3,6}/g, "X")  //貪婪模式,結(jié)果為"XX"
"123456789".replace(/d{3,6}?/g, "X")  //非貪婪模式,結(jié)果為"XXX"
分組

() - 將正則表達(dá)式分組,以控制量詞的作用范圍,比如:baron{3} (baron){3},二者是有區(qū)別的。

| - 表示 或,也可以配合()進(jìn)行使用,比如: foo|bar 和 fo(o|b)ar

反向引用和忽略分組

有時(shí),我們在匹配到正則對應(yīng)的字符串時(shí),還想要使用匹配到的部分內(nèi)容,這時(shí)候可以使用$1,$2,$3等符號引用分組捕獲的內(nèi)容。
比如:

"12/03/2017".replace(/(d{2})/(d{2})/(d{4})/, "$3-$1-$2") //輸出2017-12-03

這里為了獲得年月日的引用,使用()給正則添加了三個(gè)分組,然后就可以從前往后分別用$1 $2 $3代替分組捕獲的內(nèi)容。

所有()里匹配到的內(nèi)容默認(rèn)都會(huì)被捕獲到,有時(shí)候,我們只是想要使用()簡單的分組功能,而不需要讓正則表達(dá)式捕獲分組內(nèi)容,此時(shí),只需要在分組內(nèi)添加?:即可,比如:

"12/03/2017".replace(/(d{2})/(?:d{2})/(d{4})/, "$2-$1")
//輸出2017-12月,第二個(gè)分組的內(nèi)容被忽略。
前瞻,后顧和斷言

這里出現(xiàn)了三個(gè)新的概念,但其實(shí)他們也很簡單。
首先,我們要分清何為前,何為后。
正則匹配字符串是從前往后解析,所以,往字符串尾部方向叫前瞻,往字符串頭部方向叫后顧。
js中的正則表達(dá)式支持前瞻不支持后顧,所以這里只介紹前瞻。

前瞻一般結(jié)合斷言使用,其實(shí)斷言(assert)就相當(dāng)于給正則加的一個(gè)限制條件 -- 表示匹配項(xiàng)不僅要符合正則表達(dá)式,而且要符合斷言給出的條件。

正向前瞻 - exp(?=assert),比如/d{2}(?=a)/ 表示匹配兩個(gè)數(shù)字且后面必須有字母a跟隨

負(fù)向前瞻 - exp(?!assert),比如/d{2}(?!a)/ 表示匹配兩個(gè)數(shù)字且后面沒有字母a跟隨

注意: 斷言只是相當(dāng)于正則的條件,并不會(huì)真正的匹配相應(yīng)的字符。

我們再來分析開頭給出的那段代碼:

price.toString().replace(/B(?=(d{3})+$)/g, ",");
正則 /B(?=(d{3})+$)/g中,
d{3}+$表示以一個(gè)或多個(gè)三個(gè)數(shù)字結(jié)尾,
?=表示這部分是斷言,是正則的條件,即匹配一個(gè)零寬的非單詞邊界,且后面有(3,6,9...)個(gè)數(shù)字字符的情況
js中正則表達(dá)式api 正則的實(shí)例屬性

一個(gè)正則表達(dá)式的實(shí)例具有以下一些實(shí)例屬性

multiline - 布爾值,表示正則是否多行匹配,對應(yīng)于標(biāo)志中的"m"

global - 布爾值,表示是否全局匹配,對應(yīng)于標(biāo)志中的"g"

ignoreCase - 布爾值,表示是否忽略大小寫,對應(yīng)于標(biāo)志中的"i"

source - 字符串,是正則表達(dá)式模式的字符串表示,比如/d{2}ac/gi的source屬性就是"d{2}ac", 該值不會(huì)包含正則兩邊的//和標(biāo)志gi,也不會(huì)像構(gòu)造函數(shù)參數(shù)那樣對進(jìn)行轉(zhuǎn)義。

lastIndex - 整數(shù),表示下一次匹配的起始位置,該值只有在"g"模式下才有用,在不全局匹配時(shí)始終是0

正則的實(shí)例方法

正則表達(dá)式主要有兩個(gè)實(shí)例方法test和exec。
假設(shè)regexp表示一個(gè)正則的實(shí)例,str表示一個(gè)字符串,那么

regexp.test(str) - 返回一個(gè)布爾值,如果找到匹配項(xiàng),返回true,否則false。

reg.exex(str) - 返回一個(gè)數(shù)組, 數(shù)組第一項(xiàng)為匹配到的字符串,后面項(xiàng)依次為分組捕獲到的信息,該數(shù)組還具有input和index兩個(gè)屬性,input表示進(jìn)行匹配的字符串 - 即參數(shù)str,index表示匹配到的字符串的起始位置。

這里要注意的是:應(yīng)用了全局"g"標(biāo)志和沒有全局"g"標(biāo)志的同一個(gè)模式的正則,對于同一個(gè)字符串,兩種方法的表現(xiàn)可能是不同的。 因?yàn)槿绻麤]有全局標(biāo)識,每次都會(huì)從字符串起始位置0開始匹配,而應(yīng)用了"g",會(huì)從上次匹配的結(jié)束位的下一位開始匹配。

正則的靜態(tài)屬性

正則的構(gòu)造函數(shù)RegExp具有一些靜態(tài)屬性,這些屬性中保存著最新一次正則匹配的信息。
比如RegExp.$1-$9中,保存著最近一次匹配中分組捕獲到的信息。
還有一些其他的靜態(tài)屬性,但平時(shí)使用較少,不再介紹,具體可查閱MDN文檔。

字符串中使用正則的一些方法

String.prototype.search(regexp) - 返回匹配到的子字符串的索引或者-1, 會(huì)忽略正則中的"g"標(biāo)志

String.prototype.match(regexp) - 返回一個(gè)數(shù)組,這里是否有"g"標(biāo)識會(huì)對返回值產(chǎn)生影響,如果正則沒有"g"標(biāo)志,那么返回的數(shù)組的上面正則的exec返回的數(shù)組形式相同。 如果有"g"標(biāo)志,返回的是一個(gè)包含所有匹配子字符串的數(shù)組,且該數(shù)組也不再有input和index屬性。

String.prototype.split(regexp) - split的參數(shù)除了是一個(gè)字符串外,還可以是一個(gè)正則表達(dá)式。

String.prototype.replace(str|regexp, replaceStr|function)

字符串的replace是一個(gè)非常強(qiáng)大的方法,來看一個(gè)例子:

//我們想把"a1b2c3d4e5"這個(gè)字符串替換成字母后數(shù)字都加1,變成"a2b3c4d5e6"
"a1b2c3d4e5".replace(/d/g, function(match, index, origin){
    return parseInt(match) + 1
  })

以上就是關(guān)于正則的全部總結(jié),精力有限,寫的比較亂,見諒。
這里推薦一個(gè)非常好的介紹js正則表達(dá)式的課程慕課網(wǎng)-javaScript正則表達(dá)式

參考

《javascript高級程序設(shè)計(jì)》
Regexper正則圖形化工具
MDN正則表達(dá)式

  • 0-9 ?

  • A-Za-z0-9_ ?

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

    轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95967.html

    相關(guān)文章

    • 正則達(dá)式

      摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書問世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號手機(jī)號中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來查找特定的信息(搜索),也可以用來查...

      bang590 評論0 收藏0
    • javascript正則達(dá)式總結(jié)

      摘要:如果你知道正則表達(dá)式模式將會(huì)改變,或者你事先不知道什么模式,而是從另一個(gè)來源獲取,如用戶輸入,這些情況都可以使用構(gòu)造函數(shù)。 為什么要使用正則表達(dá)式 正則表達(dá)式通過由普通字符和特殊字符組成的文字模板完成對字符串的校驗(yàn),搜索,替換。在javascript中類似這樣 /^1d{10}$/ 上面的這個(gè)簡單的正則用來匹配手機(jī)號至于說正則表達(dá)式到底有什么意義,借由《精通正則表達(dá)式》里面的一句話來概...

      impig33 評論0 收藏0
    • 密碼強(qiáng)度的正則達(dá)式JavaScript總結(jié)

      摘要:簡言本文給出了兩個(gè)密碼強(qiáng)度的正則表達(dá)式方案,一個(gè)簡單,一個(gè)更復(fù)雜和安全。要寫出正確的正則表達(dá)式,先要定義表達(dá)式規(guī)則。重復(fù)在正則表達(dá)式中用來表示元素重復(fù)出現(xiàn)的次數(shù)。你可以根據(jù)項(xiàng)目需要,自己調(diào)整上述正則表達(dá)式。 簡言 本文給出了兩個(gè)密碼強(qiáng)度的正則表達(dá)式方案,一個(gè)簡單,一個(gè)更復(fù)雜和安全。并分別給出了兩個(gè)方案的解析和測試程序。一般大家可以根據(jù)自己的項(xiàng)目的實(shí)際需要,自行定義自己的密碼正則約定。 ...

      Carl 評論0 收藏0
    • JavaScript學(xué)習(xí)總結(jié)(八)正則達(dá)式

      摘要:首先推薦幾個(gè)正則表達(dá)式編輯器正則表達(dá)式是一種查找以及字符串替換操作。此表所列的常用正則表達(dá)式,除個(gè)別外均未在前后加上任何限定,請根據(jù)需要,自行處理。例如對而言,則采用一對引號來確定正則表達(dá)式的邊界。 這篇文章本來很早就要寫的,拖了挺久的,現(xiàn)在整理下,供大家學(xué)習(xí)交流哈! 基本概念 正則表達(dá)式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為元字符)。模式描述在搜...

      trilever 評論0 收藏0
    • 正則達(dá)式

      摘要:最全正則表達(dá)式總結(jié)驗(yàn)證號手機(jī)號中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對字符串執(zhí)行模式匹配。學(xué)習(xí)目標(biāo)了解正則表達(dá)式語法在中使用正則表達(dá)式在中使 JS高級技巧 本篇是看的《JS高級程序設(shè)計(jì)》第23章《高級技巧》做的讀書分享。本篇按照書里的思路根據(jù)自己的理解和經(jīng)驗(yàn),進(jìn)行擴(kuò)展延伸,同時(shí)指出書里的一些問題。將會(huì)討論安全的類型檢測、惰性載入函數(shù)、凍結(jié)對象、定時(shí)器等話題。1. 安全的類型檢測...

      yibinnn 評論0 收藏0

    發(fā)表評論

    0條評論

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