正則基礎之非捕陣列

2021-06-01 11:38:13 字數 1848 閱讀 6181

非捕獲組:(?:expression)

接觸正規表示式不久的人,通常都會對非捕獲比較迷惑,為什麼要有非捕獲組?作用是什麼?應該在什麼場景下使用?

說到非捕獲組,首先要了解什麼是捕獲組,詳細內容參考 正則基礎之——捕獲組(capture group)。 

1、為什麼要有非捕獲組

一旦使用了「()」,就會預設為是普通捕獲組,從而將「()」內表示式匹配的內容捕獲到組裡。但是有些情況下,不得不用「()」,但並不關心「()」中匹配的內容是什麼,後面也不會引用捕獲到的內容,這帶來了乙個***,記錄這些捕獲組就會占用記憶體,降低匹配效率。

設計非捕獲組的目的就是為了抵消這種***。 只進行分組,並不將子表示式匹配到的內容捕獲到組裡。

2、不得不使用(),由此可能帶來***的情況

以下舉例中只說明場景,舉例比較簡單,實際應用涉及到時可能會比較複雜。

a)         使用「|」表示「或」的關係時,用「()」限制範圍

舉例:匹配0到100的數字

正規表示式:^([1-9]?[0-9]|100)$

如果不用「()」來限制「|」的範圍,結果就會出錯,詳見「|」的解釋。

b)         使用量詞限定乙個子表示式整體的匹配次數

舉例:匹配hh:mm:ss格式時間

正規表示式:([01][0-9]|2[0-3])(:[0-5][0-9])

這裡的「」是對前面的「:[0-5][0-9]」整體作修飾,因此要用「()」來限定修飾的範圍。

當然,量詞還可以是?、*、+、、、,以及非貪婪模式的量詞等。

c)         某些時候為了使捕獲組的編號可控,可能會用到非捕獲組,這種應用不多,這裡不贅述。

3、什麼時候該用非捕獲組

非捕獲組主要是在涉及到效率時才考慮使用,而效率通常都是相對的,需要綜合考慮。

不考慮效率的場合,可以不用非捕獲組,以提高正規表示式的可讀性。

一些非常簡單的正則中,如果使用了非捕獲組,因為要解析這種語法,反而可能會降低匹配效率。

一般在較複雜,「()」使用較多的正規表示式中可以考慮使用非捕獲組,比如驗證日期的正規表示式。

未使用非捕獲組的正則:

^((?!0000)[0-9]-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9](0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

由於這裡的「()」都是用作分組,並不關心分組匹配到的內容,而且使用的()很多,影響匹配效率,所以這個正規表示式中可以使用非捕獲組。

^(?:(?!0000)[0-9]-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9](?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

C基礎之陣列

首先我們介紹多維陣列 對於二維陣列a 4 6 由於陣列名代表陣列的起始位址,所以a 第一層 和第乙個元素a 0 0 位址的數字是相同的,但是意義卻是不同的。對於該陣列我們可以理解為 a的一維陣列 第一層 它有四個元素a 0 a 1 a 2 a 3 第二層 而每個元素又含有6個元素a 0 0 a 0 ...

php基礎之陣列

arr array a b c arr1 array a 1,b 2,5,10 100 關聯陣列 arr2 array arr2 15 arr2 15 arr3 100 arr3 10 arr3 中國夢 echo arr3 0 下標如果有重複,後面的會覆蓋前面的 陣列單元的順序是由其放入順序決定而不...

C 基礎之陣列

由於陣列是資料的集合,所以陣列的型別就是資料的型別。他們分別是int double decimal char string bool第一種int nums new int 10 長度為10,索引為0 9 int型別第二種int nums new int 此陣列就能存5個值第三種int nums ne...