其實我是想說平衡組,但我並是想寫一篇給零基礎的朋友們閱讀,我希望你是對正則有所了解,對平衡組不太了解的朋友閱讀。如果已經了解,看看也無妨。多一點思路。
分組捕獲 -
()
就是用括號把要匹配的內容擴起來
命名分組捕獲 -
(?)或(?'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 ...