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

資訊專欄INFORMATION COLUMN

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

bitkylin / 3092人閱讀

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

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

更多語法可以在W3C正則里查看

匹配位置

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

常用方法和屬性

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

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

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

常用的方法

舉個(gè)簡單的例子,我們來了解下test()和exec()的區(qū)別和使用場景。

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

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

常用的屬性

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

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

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

例子: 手機(jī)號碼

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

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

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

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

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

例子:郵箱

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

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

例子:網(wǎng)站

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

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

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

分組

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

捕獲型分組

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

捕獲型分組-引用

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

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)簽,來說明捕獲到的分組怎么去引用。
首先我們分析一下這個(gè)匹配的規(guī)則,開始標(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則為動態(tài)捕獲到的分組。當(dāng)標(biāo)簽為時(shí),RegExp.$1為/, // 字符串中用

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

捕獲型分組-反向引用

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

非捕獲型分組

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

    hover_lew 評論0 收藏0
  • 深入理解js

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

    caikeal 評論0 收藏0

發(fā)表評論

0條評論

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