溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么查看正則表達(dá)式的AST

發(fā)布時間:2022-03-10 11:17:29 來源:億速云 閱讀:202 作者:小新 欄目:web開發(fā)

這篇文章主要為大家展示了“怎么查看正則表達(dá)式的AST”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么查看正則表達(dá)式的AST”這篇文章吧。

字符串的處理基本都會用正則表達(dá)式,用它來做字符串的匹配、提取、替換等很方便。

但是正則表達(dá)式的學(xué)習(xí)還是有些難度的,比如貪婪匹配、非貪婪匹配、捕獲子組、非捕獲子組等概念,不止初學(xué)者難理解,有很多工作幾年的人都不理解。

那正則表達(dá)式怎么學(xué)比較好?怎么快速掌握正則表達(dá)式呢?

正則表達(dá)式的匹配原理是把模式串 parse 成 AST,然后通過這個 AST 去匹配目標(biāo)字符串。

模式串中的各種信息在 parse 之后都會保存在 AST 里面。AST 是 abstract syntax tree,抽象語法樹的意思,顧名思義,是按照語法結(jié)構(gòu)組織的一棵樹,那么從 AST 的結(jié)構(gòu)上自然可以輕易的知道正則表達(dá)式支持的語法。

怎么查看正則表達(dá)式的 AST 呢?

可以通過 astexplorer.net 這個網(wǎng)站來可視化的查看:

怎么查看正則表達(dá)式的AST

切換 parse 的語言為 RegExp,就可以做正則表達(dá)式的 AST 的可視化。

就像前面所說,AST 是按照語法來組織的一棵樹,那么從它的結(jié)構(gòu)上自然能容易地理清各種語法。

那么我們就從 AST 的角度來學(xué)習(xí)下各種語法吧:

/abc/

先從簡單的開始,/abc/ 這樣一個正則就可以匹配 'abc' 的字符串,它的 AST 是這樣的:

怎么查看正則表達(dá)式的AST

3 個 Char,值分別是 a、b、c,類型是 simple。那之后的匹配就是遍歷 AST,分別匹配這三個字符了。

我們用 exec 的 api 測試了下:

怎么查看正則表達(dá)式的AST

第 0 個元素是匹配的字符串,index 是匹配字符串的開始下標(biāo)。input 是輸入的字符串。

再來試下特殊的字符:

/\d\d\d/

/\d\d\d/ 是匹配三個數(shù)字的意思,\d 是正則支持的有特殊含義的元字符(meta char)。

通過 AST 我們也可以看出來,它們雖然也是 Char,但類型確是 meta:

怎么查看正則表達(dá)式的AST

可以通過 \d 的元字符來匹配任意數(shù)字:

怎么查看正則表達(dá)式的AST

哪些是 meta char 哪些是 simple char,通過 AST 來看一目了然。

/[abc]/

正則支持通過 [] 的方式來指定一組字符,也就是說匹配其中任意一種字符都行。

通過 AST 我們也可以看出來,它被包裹了一層 CharacterClass,就是字符類的意思,也就是匹配它包含的任意一種字符都行。

怎么查看正則表達(dá)式的AST

測試下也確實(shí)是這樣:

怎么查看正則表達(dá)式的AST

/a{1,3}/

正則表達(dá)式支持指定某個字符重復(fù)多少次,用 {from,to} 的形式,

比如 /b{1,3}/ 表示字符 b 重復(fù) 1 到 3 次,/[abc]{1,3}/ 表示這個 a/b/c 字符類重復(fù) 1 到 3 次。

通過 AST 可以看出來,這種語法叫做 Repetition(重復(fù)):

怎么查看正則表達(dá)式的AST

他有個 quantifier 的屬性表示量詞,這里的類型是 range,從 1 到 3。

正則也支持一些量詞的簡寫,比如 + 表示 1 到無數(shù)次、* 表示 0 到無數(shù)次、? 表示 0 或 1 次。

分別是不同類型的量詞:

怎么查看正則表達(dá)式的AST

有同學(xué)可能會問,這里的 greedy 屬性是啥意思呢?

怎么查看正則表達(dá)式的AST

greedy 是貪婪的意思,這個屬性就表示這個 Repetition 是貪婪匹配還是非貪婪匹配。

如果在量詞后加個 ?,你就會發(fā)現(xiàn) greedy 變成 false 了,也就是切換到了非貪婪匹配:

怎么查看正則表達(dá)式的AST

那貪婪和非貪婪是指啥呢?

我們看個例子就知道了。

怎么查看正則表達(dá)式的AST

默認(rèn) Repetition 的匹配是貪婪的,只要滿足條件就一直匹配下去,所以這里 acbac 都能匹配到。

量詞后加個 ? 就切換到了非貪婪,就只會匹配第一個了:

怎么查看正則表達(dá)式的AST

這就是貪婪匹配和非貪婪匹配,通過 AST 我們能夠清楚的知道貪婪和非貪婪是針對重復(fù)語法來說的,默認(rèn)是貪婪匹配,在量詞后加個 ? 就可以切換到非貪婪。

(aaa)bbb(ccc)

正則表達(dá)式支持通過()把匹配到的一部分字符串放到子組里返回。

通過 AST 看一下:

怎么查看正則表達(dá)式的AST

對應(yīng)的 AST 就叫做 Group。

而且你會發(fā)現(xiàn)它有個 capturing 的屬性,默認(rèn)是 true:

怎么查看正則表達(dá)式的AST

這是啥意思呢?

這就是子組捕獲的語法。

如果不想捕獲子組,可以這樣寫 (?:aaa)

怎么查看正則表達(dá)式的AST

看,capturing 變?yōu)?false 了。

那捕獲和非捕獲有什么區(qū)別呢?

我們試一下:

怎么查看正則表達(dá)式的AST

哦,原來 Group 的 capturing 屬性代表的是是否提取的意思啊。

我們通過 AST 可以看出來,捕獲是針對子組來說的,默認(rèn)是捕獲,也就是提取子組的內(nèi)容,可以通過 ?: 切換到非捕獲,就不會提取子組的內(nèi)容了。

我們對用 AST 來了解正則語法已經(jīng)輕車熟路了,那來看點(diǎn)難的:

/bbb(?=ccc)/

正則表達(dá)式支持通過 (?=xxx) 的語法來表示先行斷言,用來判斷某個字符串是否前面是某個字符串。

通過 AST 可以看到這種語法叫做 Assertion,并且類型為 lookahead,也就是往前看,只匹配前面的意思:

怎么查看正則表達(dá)式的AST

這是啥意思呢?為啥要這么寫?和 /bbb(ccc)/ 還有 /bbb(?:ccc)/有啥區(qū)別呢?

我們試一下:

怎么查看正則表達(dá)式的AST

從結(jié)果可以看出來:

/bbb(ccc)/ 匹配了 ccc 的子組并且提取出來了這個子組,因?yàn)槟J(rèn)子組是捕獲的。

/bbb(?:ccc)/ 匹配了 ccc 的子組但沒有提取出來,因?yàn)槲覀兺ㄟ^ ?: 設(shè)置了子組不捕獲。

/bbb(?=ccc)/ 匹配了 ccc 的子組也沒有提取出子組,說明也是非捕獲的。它和 ?: 的區(qū)別是 ccc 沒有出現(xiàn)在匹配結(jié)果里。

這就是先行斷言(lookahead assertion)的性質(zhì):先行斷言代表某段字符串前面是某段字符串,對應(yīng)的子組是非捕獲的,而且斷言的字符串不會出現(xiàn)在匹配結(jié)果中。

如果后面不是跟著那段字符串就不匹配:

怎么查看正則表達(dá)式的AST

/bbb(?!ccc)/

把 ?= 改成 ?! 之后意思就變了,通過 AST 看一下:

怎么查看正則表達(dá)式的AST

雖然還是先行斷言 lookahead assertion,但是多了個 negative 為 true 的屬性。

這個意思很明顯,本來是前面是某段字符串,否定之后就是前面不是某段字符串。

那匹配結(jié)果正好就反過來了:

怎么查看正則表達(dá)式的AST

現(xiàn)在前面不是某段字符串的話才匹配了,這就是否定先行斷言。

/(?<=aaa)bbb/

有先行斷言自然也有后行斷言,也就是后面是某段字符串才匹配。

怎么查看正則表達(dá)式的AST

同理,也可以否定:

怎么查看正則表達(dá)式的AST

(?<=aaa)對應(yīng)的 AST 很容易想到,就是 lookbehind assertion:

怎么查看正則表達(dá)式的AST

(?<!aaa)對應(yīng)的 AST 就是加個 negative 屬性:

怎么查看正則表達(dá)式的AST

以上是“怎么查看正則表達(dá)式的AST”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

ast
AI