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

資訊專欄INFORMATION COLUMN

深入淺出,手把手教你編寫正則表達(dá)式

Jackwoo / 3291人閱讀

摘要:日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。主要可以干的事情有兩個(gè),引用和反向引用,在一些稍微復(fù)雜的正則表達(dá)式里,我們常常會(huì)用到這些。

日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。
基本語(yǔ)法
[xyz]     一個(gè)字符集,匹配任意一個(gè)包含的字符
[^xyz]    一個(gè)否定字符集,匹配任何為包含的字符
w (小寫) 匹配字母或數(shù)字或者下劃線的字符
W (大寫) 匹配不是字母,數(shù)字,下劃線的字符
s (小寫) 匹配任意空白符
S (大寫) 匹配不是空白符的字符
d (小寫) 匹配數(shù)字
D (大寫) 匹配非數(shù)字的字符
 (小寫) 匹配單詞的開(kāi)始或結(jié)束的位置
B (大寫) 匹配不是單詞開(kāi)頭或結(jié)束的位置
 $        匹配字符串的結(jié)束
 ^        匹配字符串的開(kāi)始
 .        匹配所有,除了換行符
 -        重復(fù)0次或更多次
 -        重復(fù)1次或更多次
 ?        重復(fù)0次或一次
 {n}      重復(fù)n次
 {n,}     重復(fù)n次或更多次
 {n, m}   重復(fù)n次到m次
等更多.........

更多語(yǔ)法可以在W3C正則里查看

匹配位置

需要強(qiáng)調(diào)一下匹配位置的幾個(gè)語(yǔ)法, 后面會(huì)一一舉例說(shuō)明
^ 匹配字符串的開(kāi)始
$ 匹配字符串的結(jié)尾
(?=pattern) 正向前瞻,字符串匹配滿足條件的位置
(?!pattern) 負(fù)向前瞻,字符串匹配滿足條件的位置

常用方法和屬性

正則表達(dá)式的寫法有兩種

var reg = new RegExp("/1/")
var reg = /1/

reg是正則對(duì)象的實(shí)例,通過(guò)console.dir打印對(duì)象,我們能看到實(shí)例上面的屬性和方法。

常用的方法

舉個(gè)簡(jiǎn)單的例子,我們來(lái)了解下test()和exec()的區(qū)別和使用場(chǎng)景。

var reg = /1/, reg1 = /(1)/
reg.test(1111) // true
reg.test(222) // false
reg.exec(11112) // ["1", index: 0, input: "11112"]
reg1.exec(11112) // ["1111", "1", index: 0, input: "11112"]
reg1.exec(222) // null

test驗(yàn)證后會(huì)返回一個(gè)布爾值,主要用于驗(yàn)證是否匹配,exec則在驗(yàn)證成功后返回一個(gè)類似數(shù)組的對(duì)象,主要用于捕獲分組,失敗則返回null。

reg1是一個(gè)匹配(1)分組的正則,使用exec匹配成功后返回["1111", "1", index: 0, input: "11112"],input是輸入的值,第一項(xiàng)是匹配滿足條件的數(shù)據(jù),第二項(xiàng)是匹配到的分組,如果沒(méi)有分組,第二項(xiàng)則不存在,index屬性則表示從第幾項(xiàng)開(kāi)始匹配到。
關(guān)于分組的話在下面會(huì)有詳細(xì)的例子說(shuō)明。

常用的屬性

 ignoreCase 忽略大小寫,默認(rèn)為false
 global     全局匹配,默認(rèn)為false
 multiline  在有換行的時(shí)候,可以得到換行的起始位置和終止位置,默認(rèn)為false
匹配規(guī)則

正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串做替換或者從某個(gè)串中取出符合某個(gè)條件的子串等

當(dāng)當(dāng)看描述和說(shuō)明文檔可能有點(diǎn)太官方化了,先假設(shè)我們已經(jīng)都了解了正則匹配的基本語(yǔ)法和大致的使用,接下來(lái)這里用簡(jiǎn)淺的例子一步一步來(lái)分析怎樣去實(shí)現(xiàn)自己需要的正則表達(dá)式。

例子: 手機(jī)號(hào)碼

首先舉個(gè)例子,要匹配一個(gè)手機(jī)號(hào)碼。先分析一下手機(jī)號(hào)碼有什么樣的規(guī)則呢,1開(kāi)頭,必須為數(shù)字,而且總共長(zhǎng)度為十一位,那我們就有了下面這個(gè)表達(dá)式:

var reg = /^1[0-9]{10}$/ // 根據(jù)正則語(yǔ)法 ^為匹配開(kāi)始,^1就表示第一位必須為1開(kāi)頭,[0-9]指的是必須為0-9的數(shù)字,{10}表示重復(fù)次數(shù)為10,$結(jié)束符。簡(jiǎn)單的匹配規(guī)則完成。

好像有點(diǎn)粗糙,一般手機(jī)號(hào)碼第二位是不會(huì)有0-9這么多的可能的,所以我們需要在優(yōu)化一下,第一位為1,第二位為[3,5,8,7]:

var reg = /^1[3,5,8,7]{1}[0-9]{9}$/ // 根據(jù)正則語(yǔ)法 ^為匹配開(kāi)始,^1就表示第一位必須為1開(kāi)頭,[3,5,8,7]指的是匹配其中任一數(shù)字,{1}表示重復(fù)次數(shù)為1,前兩位匹配完成,加上后面的[0-9],{9}重復(fù)九次,$結(jié)束符。簡(jiǎn)單的匹配規(guī)則完成。

這樣,基本的一個(gè)手機(jī)號(hào)碼的正則匹配規(guī)則就出來(lái)了,如果自己業(yè)務(wù)有需求,做相對(duì)應(yīng)的改動(dòng)就可以了。

例子:郵箱

和手機(jī)號(hào)碼的規(guī)則相比較,郵箱的匹配規(guī)則稍微復(fù)雜一點(diǎn)。同樣,我們先分析郵箱的規(guī)則,比如QQ郵箱,[email protected],先有字符,長(zhǎng)度大于1,然后是@,后面再跟著一串字符長(zhǎng)度大于1,那我們就可以得到這樣一個(gè)的表達(dá)式:

var reg = /^[w.]+@[w.]+$/ // [w.] w匹配字母或數(shù)字或者下劃線的字符,.通過(guò)轉(zhuǎn)義符表示匹配.,+表示重復(fù)一次或更多次,匹配@符號(hào),然后又是同樣的w.匹配一次或更多次。

例子:網(wǎng)站

同樣是分析網(wǎng)站規(guī)則,http(s)://segmentfault.com/1233, 首先可能是http協(xié)議或者h(yuǎn)ttps協(xié)議,然后是://,然后是字符串。這樣一分析,再把對(duì)應(yīng)的正則語(yǔ)法理一理,很快一個(gè)匹配規(guī)則就出來(lái)了:

var reg = /^https?://.+$/ // 首先會(huì)是http開(kāi)頭,^http, 然后s跟隨?表示匹配0次或一次,:,//需要用轉(zhuǎn)義,后面跟隨各種類型的不確定因素.+,當(dāng)然,如果我們要做的更精確的匹配,則可以修改成自己的規(guī)則即可。

舉了幾個(gè)基本的例子,讓我們?nèi)?fù)習(xí)鞏固正則的基本使用和匹配規(guī)則,首先分析要匹配的規(guī)則是什么,然后一步一步去把規(guī)則拼積木一樣拼進(jìn)去,就可以了,自己多定義一些不一樣的規(guī)則然后去一個(gè)一個(gè)實(shí)現(xiàn),就會(huì)發(fā)現(xiàn)如果只是基本的使用,遠(yuǎn)沒(méi)有想象中的難。

分組

分組的就是把要匹配的規(guī)則分成一個(gè)組,寫在()里,比如匹配數(shù)字(0-9),匹配字母(0-z),主要有分為捕獲型分組和非捕獲型分組。

捕獲型分組

先來(lái)說(shuō)說(shuō)捕獲型分組。主要可以干的事情有兩個(gè),引用和反向引用,在一些稍微復(fù)雜的正則表達(dá)式里,我們常常會(huì)用到這些。

捕獲型分組-引用

在每次分組捕獲之后,RegExp對(duì)象上面可以拿到最近捕獲到的分組,下面來(lái)舉一些例子:

var reg = /(1)(3)/ // 兩個(gè)分組
reg.exec(123134) // 捕獲到了兩個(gè)分組
console.log(RegExp.$1) // 1
console.log(RegExp.$2) // 3

得到到了最近捕獲的分組,可是往往我們不明白捕獲到了分組有什么用,下面舉個(gè)例子,將所有的html標(biāo)簽替換成p標(biāo)簽,來(lái)說(shuō)明捕獲到的分組怎么去引用。
首先我們分析一下這個(gè)匹配的規(guī)則,開(kāi)始標(biāo)簽為<字符串>,結(jié)束標(biāo)簽為,我們只需要把這些替換為

就可以了。

var str = "1234
456
" var reg = /<(/?)(w+)>/g // 先匹配<,然后(/?)重復(fù)0或一次,然后匹配w+,匹配>,結(jié)束。 str.replace(reg, "<$1p>") // 字符串的替換方法,這里使用了$1,就是RegExp.$1,引用正則里面的分組(/?), // 所以<$1p>中的$1則為動(dòng)態(tài)捕獲到的分組。當(dāng)標(biāo)簽為時(shí),RegExp.$1為/, // 字符串中用

替換原來(lái)標(biāo)簽, // 則達(dá)到了將html字符串中開(kāi)始標(biāo)簽和閉合標(biāo)簽全部替換的效果

捕獲型分組-反向引用

反向引用也是一樣將捕獲到的分組引用,不過(guò)是在編寫的正則里面,通過(guò)/1,/2,/3可以得到當(dāng)前捕獲到的分組.

非捕獲型分組

(?:)即表示該分組不能被捕獲,之后在引用的時(shí)候是引用不到這個(gè)分組的。

貪婪匹配和惰性匹配 正向前瞻和負(fù)向前瞻

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

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

相關(guān)文章

  • 深入淺出,手把教你編寫正則達(dá)式

    摘要:日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。主要可以干的事情有兩個(gè),引用和反向引用,在一些稍微復(fù)雜的正則表達(dá)式里,我們常常會(huì)用到這些。 日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。 基本語(yǔ)法 [xyz] ...

    bitkylin 評(píng)論0 收藏0
  • 深入淺出,手把教你編寫正則達(dá)式

    摘要:日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。主要可以干的事情有兩個(gè),引用和反向引用,在一些稍微復(fù)雜的正則表達(dá)式里,我們常常會(huì)用到這些。 日常代碼的開(kāi)發(fā)中,大家都或多或少的碰到一些正則表達(dá)式,但有的朋友只是會(huì)用,或者大致明白,希望這篇對(duì)正則深入淺出的文章能夠讓大家有所收獲。 基本語(yǔ)法 [xyz] ...

    andot 評(píng)論0 收藏0
  • 只有20行Javascript代碼!手把教你寫一個(gè)頁(yè)面模板引擎

    摘要:整個(gè)引擎實(shí)現(xiàn)只有不到行代碼。不知道你有木有聽(tīng)說(shuō)過(guò)一個(gè)基于的頁(yè)面預(yù)處理器,叫做。最初我只是打算寫一個(gè)的預(yù)處理器,不過(guò)后來(lái)擴(kuò)展到了和,可以用來(lái)把代碼轉(zhuǎn)成和代碼。最后一個(gè)改進(jìn)可以使我們的模板引擎更為強(qiáng)大。 導(dǎo)讀:AbsurdJS 作者寫的一篇教程,一步步教你怎樣用 Javascript 實(shí)現(xiàn)一個(gè)純客戶端的模板引擎。整個(gè)引擎實(shí)現(xiàn)只有不到 20 行代碼。如果你能從頭看到尾的話,還能有不少收獲的。...

    Luosunce 評(píng)論0 收藏0
  • PHP小知識(shí)點(diǎn)

    摘要:那些瑣碎的知識(shí)點(diǎn)作者記錄的的很奇特很難記的知識(shí)點(diǎn)。易錯(cuò)知識(shí)點(diǎn)整理注意和的區(qū)別中和都是輸出的作用,但是兩者之間還是有細(xì)微的差別。今天手頭不忙,總結(jié)一下,分享過(guò)程中掌握的知識(shí)點(diǎn)。 深入理解 PHP 之:Nginx 與 FPM 的工作機(jī)制 這篇文章從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的。 PHP 那些瑣碎的知識(shí)...

    hover_lew 評(píng)論0 收藏0
  • 深入理解js

    摘要:詳解十大常用設(shè)計(jì)模式力薦深度好文深入理解大設(shè)計(jì)模式收集各種疑難雜癥的問(wèn)題集錦關(guān)于,工作和學(xué)習(xí)過(guò)程中遇到過(guò)許多問(wèn)題,也解答過(guò)許多別人的問(wèn)題。介紹了的內(nèi)存管理。 延遲加載 (Lazyload) 三種實(shí)現(xiàn)方式 延遲加載也稱為惰性加載,即在長(zhǎng)網(wǎng)頁(yè)中延遲加載圖像。用戶滾動(dòng)到它們之前,視口外的圖像不會(huì)加載。本文詳細(xì)介紹了三種延遲加載的實(shí)現(xiàn)方式。 詳解 Javascript十大常用設(shè)計(jì)模式 力薦~ ...

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

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

0條評(píng)論

閱讀需要支付1元查看
<