摘要:正則起源最近看完了精通正則表達(dá)式,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實(shí)戰(zhàn)和教程部分。然后下面說一下以上兩個基礎(chǔ)教程里沒說到的知識點(diǎn)。最后以上是我在精通正則表達(dá)式一書中得到的一些收獲,希望能分享給大家,如有錯誤歡迎指正。
正則起源
最近看完了 《精通正則表達(dá)式》,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實(shí)戰(zhàn)和教程部分。
下面引用一下百度百科里的內(nèi)容。
正則表達(dá)式的“鼻祖”或許可一直追溯到科學(xué)家對人類神經(jīng)系統(tǒng)工作原理的早期研究。美國新澤西州的Warren McCulloch和出生在美國底特律的Walter Pitts這兩位神經(jīng)生理方面的科學(xué)家,研究出了一種用數(shù)學(xué)方式來描述神經(jīng)網(wǎng)絡(luò)的新方法,他們創(chuàng)造性地將神經(jīng)系統(tǒng)中的神經(jīng)元描述成了小而簡單的自動控制元,從而作出了一項(xiàng)偉大的工作革新。
那么寫正則是不是就是把自己神經(jīng)工作過程通過正則表現(xiàn)出來呢? 比如讓小孩子在一堆圖形中找到匹配的圖形放入凹槽。
正則引擎正則分幾種引擎也從是本書獲得的知識點(diǎn)之一。
DFA
傳統(tǒng)型NFA
POSIX NFA
NFA范圍更廣,例如 JAVA, PHP, Ruby, .NET... 你是看不起我javascript所以才不列入的嗎?
使用DFA的是flex, MySQL, lex, awk大部分版本… 實(shí)話說,除了mysql,都沒聽過。不過不用在意!
兩個引擎的區(qū)別。
NFA 更注重表達(dá)式
DFA 文本主導(dǎo)
通過書中里例子說,NFA 用表達(dá)式來匹配文本,而 DFA 是文本來匹配文表達(dá)式。當(dāng)寫好一個正則之后,NFA 是先檢查表達(dá)式,同時檢查文本是否匹配這個表達(dá)式。而 DFA 則是先掃描文本,然后處理表達(dá)式中的所有匹配可能,如果匹配失敗,就將這條可能的線,淘汰。所以這里衍生一個概念就是回溯,NFA 有回溯,而 DFA 沒有。
知識點(diǎn)作為一個菜鳥,正則表達(dá)式一直是書到用時方恨少的角色。平時都是能抄則抄,不能抄的時候干著急,只能用 substr, indexOf, chatAt等等的方法實(shí)現(xiàn)功能,既不優(yōu)雅也不夠裝逼。上網(wǎng)學(xué)習(xí)也都是菜鳥教程,W3school。然后下面說一下以上兩個基礎(chǔ)教程里沒說到的知識點(diǎn)。
括號捕獲與反向引用當(dāng)你在正則表達(dá)式里使用了 (),在表達(dá)式匹配時,它能記住或者說緩存括號內(nèi)匹配的結(jié)果,從而可以拿到括號內(nèi)的結(jié)果,可以重復(fù)使用或者只需要括號內(nèi)的結(jié)果,來剔除不需要的匹配內(nèi)容。
// 我們經(jīng)常會用 match 方法來匹配字符串,結(jié)果是一個數(shù)組,而不是最后的匹配結(jié)果,為什么呢?看下面的例子 "abc".match(/(a)(b)(c)/) // ["abc", "a", "b", "c"] "abc".match(/abc/) // ["abc"]
可以看到,括號會緩存括號里匹配的內(nèi)容,多帶帶列出來,那么怎么拿到括號內(nèi)的內(nèi)容呢,而不是通過 match 返回的結(jié)果拿,因?yàn)橛袝r候我們需要在表達(dá)式里使用捕獲的值,從而達(dá)到匹配重復(fù)的內(nèi)容。這部分就叫反向引用。
"abc-abc-cba".replace(/(a)(b)c-12/, "") // c-cba "abc-abc-cba".replace(/(a)(b)c/g, "$1$2") // ab-ab-cba RegExp.$1 // a RegExp.$2 // b
這里展示了兩種使用反向引用的方法,一種是在表達(dá)式內(nèi)通過 12 的形式拿到兩個緩存的值,一種是使用 $1$2的形式拿到。因?yàn)檎齽t是從左開始匹配的,所以 (a) 就是第一個捕獲的匹配值,所以他是1 或是 $1,以此類推。
非捕獲型括號上面說了括號會捕獲值,一般來說這樣會影響性能,或者你會用到括號來做分組,但是不想捕獲的情況,(?:)非捕獲型括號就是這么用的,那么重寫一下上面的例子。
"abc-abc-cba".replace(/(a)(?:b)c-12/, "") // 匹配失敗了,因?yàn)?不存在 "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)視 | ?! |
?= 和 ?! 在菜鳥和w3school 里有簡單的提及,菜鳥里還提到這兩個還能重寫捕獲,但是 ?<= 和 ? 并沒有提及。
寫幾個 demo 表示一下:
// 找一個字母 a ,它緊跟在 b 前面 "abac".replace(/a(?=b)/g, "") // bac // 找到一個字母 a ,它緊跟在一個不是 b 的字母前面 "abac".replace(/a(?!b)/g, "") // abc // 接著是逆序環(huán)視 // 找到一個字母 a ,它跟在 b 后面 "abac".replace(/(?<=b)a/g, "") // abc // 找到一個字母 a ,他不跟在 b 后面 "abac".replace(/(?可以看出,環(huán)視是要和捕獲括號一起用的,并且不會占用匹配字符,他只是檢查表達(dá)式是否匹配。所以這就是重寫捕獲了。
忽略優(yōu)先量詞量詞匹配一般有三種 *、 +、?。然而還可以寫作, *? 或 +? ,使匹配結(jié)果導(dǎo)向完全不同的結(jié)果。例子:
"abc-aaa-abc-abc".replace(/abc-.*-abc/, "") // "" "abc-aaa-abc-abc".replace(/abc-.*?-abc/, "") // "-abc"*? 忽略優(yōu)先會先忽略當(dāng)前匹配的值,先匹配后面的 -abc,如果匹配失敗,再匹配自己,而 *會優(yōu)先匹配自己,等匹配結(jié)束之后,再從后面一點(diǎn)點(diǎn)吐出,回來匹配量詞后面的表達(dá)式。從而造成以上不同的結(jié)果。知道這個之后,就不會再傻傻的把 * 和 ? 分開解讀了。當(dāng)然,具體情況具體分析,到底使用哪個。
回溯正則也是會有性能問題的,如果表達(dá)式寫的不好,造成過度的災(zāi)難性回溯,會導(dǎo)致執(zhí)行時間指數(shù)級增長。具體情況還是通過搜索引擎了解吧,解釋起來會過長,而且作為正則新手的我還不一定能解釋清楚。。。
最后以上是我在《精通正則表達(dá)式》一書中得到的一些收獲,希望能分享給大家,如有錯誤歡迎指正。下一步呢就是去做一些練習(xí)來鞏固一下了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96608.html
摘要:本文內(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)性意味著我們可以使用以上種數(shù)據(jù)類型表示變換過渡動畫實(shí)現(xiàn)案例前端掘金以下所有效果的實(shí)現(xiàn)方式均為個人見解,如有不對的地方還請一一指出。 讀 zepto 源碼之工具函數(shù) - 掘金Zepto 提供了豐富的工具函數(shù),下面來一一解讀。 源碼版本 本文閱讀的源碼為 zepto1.2.0 $.extend $.extend 方法可以用來擴(kuò)展目標(biāo)對象的屬性。目標(biāo)對象的同名屬性會被源對象的屬性...
摘要:特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會及時更新,平時業(yè)務(wù)工作時也會不定期更...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗?dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導(dǎo)范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
閱讀 902·2021-10-27 14:19
閱讀 1120·2021-10-15 09:42
閱讀 1545·2021-09-14 18:02
閱讀 753·2019-08-30 13:09
閱讀 3000·2019-08-29 15:08
閱讀 2101·2019-08-28 18:05
閱讀 964·2019-08-26 10:25
閱讀 2795·2019-08-23 16:28