子模式由括號(圓括號)分隔,可以巢狀。將模式的一部分標記為子模式會產生兩個作用:
它將一組替代方案局部化。例如,模式 cat(aract|erpillar|)
匹配單詞「cat」、「cataract」或「caterpillar」其中之一。如果沒有括號,它將匹配「cataract」、「erpillar」或空字串。
它將子模式設定為擷取子模式(如上所述)。當整個模式匹配時,匹配子模式的主題字串部分會透過 pcre_exec() 的 *ovector* 參數傳回給呼叫者。從左到右計算開括號(從 1 開始)以取得擷取子模式的編號。
舉例來說,若字串「the red king」與模式 the ((red|white) (king|queen))
進行比對,則擷取的子字串為「red king」、「red」和「king」,編號分別為 1、2 和 3。
單純使用括號同時具有兩種功能並不總是方便。通常需要分組子模式,但不需要擷取功能。如果左括號後面接著「?:」,則該子模式不會進行任何擷取,並且在計算後續擷取子模式的數量時不會被計入。例如,若字串「the white queen」與模式 the ((?:red|white) (king|queen))
進行比對,則擷取的子字串為「white queen」和「queen」,編號分別為 1 和 2。最多可擷取 65535 個子字串。然而,根據 libpcre 的配置選項,可能無法編譯如此大的模式。
為方便起見,如果在非擷取子模式的開頭需要任何選項設定,則選項字母可以出現在「?」和「:」之間。因此,以下兩個模式
(?i:saturday|sunday) (?:(?i)saturday|sunday)
比對完全相同的字串集合。由於替代分支從左到右嘗試,並且選項直到子模式結束才會重置,因此一個分支中的選項設定會影響後續分支,所以上述模式會比對「SUNDAY」以及「Saturday」。
可以使用語法 (?P<name>pattern)
為子模式命名。此子模式將會在比對陣列中以其正常的數字位置和名稱進行索引。還有兩種替代語法 (?<name>pattern)
和 (?'name'pattern)
。
有時需要在正規表達式中進行多重比對,但使用交替的子群組。通常,即使這些子群組中只有一個可能匹配,每個子群組都會被賦予自己的反向參考編號。為了克服這個問題,(?|
語法允許使用重複的編號。考慮以下與字串 Sunday
比對的正規表達式
(?:(Sat)ur|(Sun))day
這裡 Sun
儲存在反向參考 2 中,而反向參考 1 為空。比對 Saturday
會產生反向參考 1 中的 Sat
,而反向參考 2 不存在。將模式更改為使用 (?|
可以解決這個問題
(?|(Sat)ur|(Sun))day
使用此模式,Sun
和 Sat
都將儲存在反向參考 1 中。