正則基礎(chǔ)教程一些冷門的知識(shí)-創(chuàng)新互聯(lián)

正則基礎(chǔ)教程一些冷門的知識(shí)
正則引擎
正則分幾種引擎也從是本書獲得的知識(shí)點(diǎn)之一。
DFA
傳統(tǒng)型NFA
POSIX NFA
NFA范圍更廣,例如 JAVA, PHP, Ruby, .NET... 你是看不起我javascript所以才不列入的嗎?
使用DFA的是flex, MySQL, lex, awk大部分版本… 實(shí)話說(shuō),除了mysql,都沒(méi)聽(tīng)過(guò)。不過(guò)不用在意!

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的翁源網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

兩個(gè)引擎的區(qū):
NFA 更注重表達(dá)式
DFA 文本主導(dǎo)
  通過(guò)書中里例子說(shuō),NFA 用表達(dá)式來(lái)匹配文本,而 DFA 是文本來(lái)匹配文表達(dá)式。當(dāng)寫好一個(gè)正則之后,NFA 是先檢查表達(dá)式,同時(shí)檢查文本是否匹配這個(gè)表達(dá)式。而 DFA 則是先掃描文本,然后處理表達(dá)式中的所有匹配可能,如果匹配失敗,就將這條可能的線,淘汰。所以這里衍生一個(gè)概念就是回溯,NFA 有回溯,而 DFA 沒(méi)有。

知識(shí)點(diǎn)
  作為一個(gè)菜鳥(niǎo),正則表達(dá)式一直是書到用時(shí)方恨少的角色。平時(shí)都是能抄則抄,不能抄的時(shí)候干著急,只能用 substr, indexOf, chatAt等等的方法實(shí)現(xiàn)功能,既不優(yōu)雅也不夠裝逼。上網(wǎng)學(xué)習(xí)也都是菜鳥(niǎo)教程,W3school。然后下面說(shuō)一下以上兩個(gè)基礎(chǔ)教程里沒(méi)說(shuō)到的知識(shí)點(diǎn)。

  括號(hào)捕獲與反向引用
  當(dāng)你在正則表達(dá)式里使用了 (),在表達(dá)式匹配時(shí),它能記住或者說(shuō)緩存括號(hào)內(nèi)匹配的結(jié)果,從而可以拿到括號(hào)內(nèi)的結(jié)果,可以重復(fù)使用或者只需要括號(hào)內(nèi)的結(jié)果,來(lái)剔除不需要的匹配內(nèi)容。

// 我們經(jīng)常會(huì)用 match 方法來(lái)匹配字符串,結(jié)果是一個(gè)數(shù)組,而不是最后的匹配結(jié)果,為什么呢?看下面的例子
"abc".match(/(a)(b)(c)/) // ["abc", "a", "b", "c"]
"abc".match(/abc/) // ["abc"]
  可以看到,括號(hào)會(huì)緩存括號(hào)里匹配的內(nèi)容,單獨(dú)列出來(lái),那么怎么拿到括號(hào)內(nèi)的內(nèi)容呢,而不是通過(guò) match 返回的結(jié)果拿,因?yàn)橛袝r(shí)候我們需要在表達(dá)式里使用捕獲的值,從而達(dá)到匹配重復(fù)的內(nèi)容。這部分就叫反向引用。

"abc-abc-cba".replace(/(a)(b)c-\1\2/, '') // c-cba
"abc-abc-cba".replace(/(a)(b)c/g, '$1$2') // ab-ab-cba
RegExp.$1 // a
RegExp.$2 // b
  這里展示了兩種使用反向引用的方法,一種是在表達(dá)式內(nèi)通過(guò) \1\2 的形式拿到兩個(gè)緩存的值,一種是使用 $1$2的形式拿到。因?yàn)檎齽t是從左開(kāi)始匹配的,所以 (a) 就是第一個(gè)捕獲的匹配值,所以他是\1 或是 $1,以此類推。

  非捕獲型括號(hào)
  上面說(shuō)了括號(hào)會(huì)捕獲值,一般來(lái)說(shuō)這樣會(huì)影響性能,或者你會(huì)用到括號(hào)來(lái)做分組,但是不想捕獲的情況,(?:)非捕獲型括號(hào)就是這么用的,那么重寫一下上面的例子。

"abc-abc-cba".replace(/(a)(?:b)c-\1\2/, '') // 匹配失敗了,因?yàn)閈2不存在
"abc-abc-cba".replace(/(a)(?:b)c-\1/, '') // bc-cba
RegExp.$1 // a
RegExp.$2 // ""
  環(huán)視

類型 正則表達(dá)式
肯定逆序環(huán)視 ?<=
否定逆序環(huán)視 ?<!
肯定順序環(huán)視 ?=
否定順序環(huán)視 ?!
  ?= 和 ?! 在菜鳥(niǎo)和w3school 里有簡(jiǎn)單的提及,菜鳥(niǎo)里還提到這兩個(gè)還能重寫捕獲,但是 ?<= 和 ?<! 并沒(méi)有提及。

  寫幾個(gè) demo 表示一下:

// 找一個(gè)字母 a ,它緊跟在 b 前面
"abac".replace(/a(?=b)/g, '') // bac

// 找到一個(gè)字母 a ,它緊跟在一個(gè)不是 b 的字母前面
"abac".replace(/a(?!b)/g, '') // abc

// 接著是逆序環(huán)視
// 找到一個(gè)字母 a ,它跟在 b 后面
"abac".replace(/(?<=b)a/g, '') // abc

// 找到一個(gè)字母 a ,他不跟在 b 后面
"abac".replace(/(?<!b)a/g, '') // bac

// 一個(gè)有趣匹配
// 在 a 和 b 之間插入一個(gè) ","
"abac".replace(/(?<=a)(?=b)/g, ",") // a,bac
  可以看出,環(huán)視是要和捕獲括號(hào)一起用的,并且不會(huì)占用匹配字符,他只是檢查表達(dá)式是否匹配。所以這就是重寫捕獲了。

忽略優(yōu)先量詞
  量詞匹配一般有三種 、 +、?。然而還可以寫作, ? 或 +? ,使匹配結(jié)果導(dǎo)向完全不同的結(jié)果。例子:

"abc-aaa-abc-abc".replace(/abc-.*-abc/, '') // ""

"abc-aaa-abc-abc".replace(/abc-.?-abc/, '') // "-abc"
  
? 忽略優(yōu)先會(huì)先忽略當(dāng)前匹配的值,先匹配后面的 -abc,如果匹配失敗,再匹配自己,而 會(huì)優(yōu)先匹配自己,等匹配結(jié)束之后,再?gòu)暮竺嬉稽c(diǎn)點(diǎn)吐出,回來(lái)匹配量詞后面的表達(dá)式。從而造成以上不同的結(jié)果。知道這個(gè)之后,就不會(huì)再傻傻的把 和 ? 分開(kāi)解讀了。當(dāng)然,具體情況具體分析,到底使用哪個(gè)。

回溯
回溯應(yīng)該算是正則里的性能殺手了吧。如果表達(dá)式寫的不好,造成過(guò)度的災(zāi)難性回溯,會(huì)導(dǎo)致執(zhí)行時(shí)間指數(shù)級(jí)增長(zhǎng)。

喜歡這樣文章的可以關(guān)注我,我會(huì)持續(xù)更新,你們的關(guān)注是我更新的動(dòng)力!需要更多java學(xué)習(xí)資料的也可以私信我!
祝關(guān)注我的人都:身體健康,財(cái)源廣進(jìn),福如東海,壽比南山,早生貴子,從不掉發(fā)!

本文標(biāo)題:正則基礎(chǔ)教程一些冷門的知識(shí)-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://muchs.cn/article0/csjjoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、軟件開(kāi)發(fā)、網(wǎng)站策劃網(wǎng)站排名、網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名