正規表示式之分組捕獲 條件表示式 平衡組

2021-06-03 06:21:31 字數 2096 閱讀 8516

其實我是想說平衡組,但我並是想寫一篇給零基礎的朋友們閱讀,我希望你是對正則有所了解,對平衡組不太了解的朋友閱讀。如果已經了解,看看也無妨。多一點思路。

分組捕獲 - 

()

就是用括號把要匹配的內容擴起來

命名分組捕獲 - 

(?)或(?'name')

就是在分組捕獲的基礎上,增加?《分組名》或?'分組名'  

為了鞏固印象,舉個例子

axaxb***b***

分組捕獲:

(a)x

一次匹配結果,將會得到ax,其中分組1捕獲結果為a

命名分組捕獲:

同樣的文字,使用(?a)x

一次匹配結果,你可以用分組序號1,或是分組名data獲得分組匹配結果a  

條件表示式 - (?...)(?(data)yes|no)

非常高興,我們開始切入正題了。條件表示式讓我們的正則具有了一定的邏輯判斷能力。比如:

文字:文字[12]和abcd

要求:找到或【】中間的數字

我們自然要考慮[】或是【]這兩種錯誤的配對關係,這正好使用條件表示式

(?<=(?/[)|(?/【))/d+(?=(?(o1)/]|/】))

別看暈了,容我慢慢給你講明這個表示式的書寫思路。

首先,我們要的是中間的數字,如果有其他的怎麼辦?當然是整個丟掉,我們不打算跑題的節外生枝把[文字]也捕獲進來,或是具有容錯的[ 12]捕獲進來,我們在討論問題,就題目而論就可以了。

我首先想到的應該使用(?<=exp)/d+(?=exp2)的寫法,這樣最終結果就只有數字了。

那麼,exp如何寫呢?

很簡單,(?<=[/[/【]),這樣的話,我們無法做到前後的括號型別配對,好吧,我們把[和【分別捕獲,並記錄對應的分組,這樣方便後面可以引用。

前面部分就變成:

(?<=(?/[)|(?【))

就單這一部分,我們就捕獲到了乙個位置,前面是[或是【的位置,而如果前面是[,則分組o1捕獲到,反之o2捕獲到,到目前為止,都關係不大。但為了能得到對應的匹配,我們配合條件表示式,就方便很多了。

exp2

我們可以寫為

(?=(?(o1)/]|/】))

什麼意思呢?

(?(o1)/]|/】)

表示這裡檢查o1分組捕獲情況,如果捕獲成功,則執行/]的匹配,反之,執行/】的匹配。這樣,我們用條件表示式,就可以確定和【】的對應關係了。

平衡組(?)(?<-group>)(?(group)?!)

這個名詞已經用了很久了,無從考證出處,《c#字串和正規表示式》書中沒有提到,無所謂出處了,但這個名字,倒是讓乙個簡單的概念變得複雜了,可能我也愚笨,弄了好久才明白,其實很簡單的東西。

說白了,就是命名分組的乙個高階用法,命名分組,我們寫(?)可以把捕獲到的內容壓入堆疊,而另乙個高階的用法,是(?<-group>)可以把已經壓入堆疊的元素彈出堆疊,(?(group)?!)則是我們剛才看到的條件表示式,如果捕獲到了group分組,則執行?!表示式,?!就是表示式為假,匹配失敗。

舉個不用標準寫法的例子,可能更容易理解一點。

例如文字:

***xaxxaxxaxxbxxbxxb***x

我們可以用**方式做a...b的驗證

[c-sharp]view plain

copy

string

test = 

"***xaxxaxxaxxbxxbxxb***x"

;  match m = regex.match(test, "a((?a)|(?<-o>b)|[^ab]+)+b"

);  

if(m.groups[

"o"].captures.count > 0)  

else  

可以不使用條件表示式,在**中判斷也可以。

做這個例子的意義是什麼呢?意思就是說明所謂的「平衡組」的工作原理,是檢查是否還有沒有彈出棧的分組,如果有,則表明不是配對存在的,反之是配對出現的。這就是常用的平衡組意義。

正規表示式 分組與捕獲

之前使用正規表示式的時候大多數狀況下只是用用匹配表示式,為什麼說是匹配表示式呢,因為其實替換文字也可以使用表示式,我稱之為替換表示式。因為通常使用正規表示式的大多會是以下情況,比如把一段文字中的a字串更改為b字串 待匹配文字 abcdabcd 匹配表示式 b 替換文字 e 替換結果 aecdaecd...

正規表示式 分組與捕獲

之前使用正規表示式的時候大多數狀況下只是用用匹配表示式,為什麼說是匹配表示式呢,因為其實替換文字也可以使用表示式,我稱之為替換表示式。因為通常使用正規表示式的大多會是以下情況,比如把一段文字中的a字串更改為b字串 待匹配文字 abcdabcd 匹配表示式 b 替換文字 e 替換結果 aecdaecd...

js正規表示式分組捕獲

const reg reg.test 比如去掉 aaa 中的中括號 這裡只是舉個例,可以這樣來處理更複雜的模板字串 const reg a za z let str aaa while reg.test str console.log str str 這裡的 1就是 1 const reg a z ...