子组通过圆括号脱离界定, 而且它们可以嵌套. 将一个模式中的一部门标志为子组(子模式)主要是来做两件工作:
1、将可选分支局部化. 好比, 模式cat(arcat|erpillar|)匹配”cat”, “cataract”, “caterpillar”中的一个, 假如没有圆括号的话, 它匹配的则是”cataract”, “erpillar”以及空字符串.
2、将子组设定为捕捉子组(向上面界说的). 当整个模式匹配后, 方针字符串中匹配子组的部门将会通过pcre_exec()()的ovector参数回传给挪用者. 左括号从左至右呈现的序次就是对应子组的下标(从1开始), 可以通过这些下标数字来获取捕捉子模式匹配功效.
好比, 假如字符串”the red king”利用模式((red|white) (king|queen))举办匹配, 模式匹配到的功效是array(“red king”, ”red king”, “red”, “king”)的形式, 个中第0个元素是整个模式匹配的功效, 后头的三个元素依次为三个子组匹配的功效. 它们的下表别离为1, 2, 3.
事实上, 圆括号推行的两种成果并不老是有用的. 常常我们会有一种需求需要利用子组举办分组, 但又不需要(单独的)捕捉它们. 在子组界说的左括号后头紧跟字符串”?:”会使得该子组不被单独捕捉, 而且不会对其后子组序号的计较发生影响. 好比, 假如字符串”the white queen”匹配模式((?:red|white) (king|queen)), 匹配到的功效会是array(“white queen”, “white queen”, “white queen”), 只捕捉了最外面的和king|queen这两个子组. 捕捉子组序号的最大值是99, 最大答允拥有的所有子组(包罗捕捉的和非捕捉的)的最大数量为200.
为了利便简写, 假如需要在非捕捉子组开始位置配置选项, 选项字母可以位于?和:之间, 好比:
(?i:saturday|sunday) (?:(?i)saturday|sunday)上面两种写法实际上是沟通的模式. 因为可选分支会从左到右实验每个分支, 而且选项没有在子模式竣事前被重置, 而且由于选项的配置会穿透对后头的其他分支发生影响, 因此, 上面的模式城市匹配”SUNDAY”以及”Saturday”
在php 4.3.3中, 可以对子组利用(?P<name>pattern)的语法举办定名. 这个子模式将会在匹配功效中同时以其名称温顺序(数字下标)呈现. php 5.2.2中又增加了两种味子组定名的语法: (?<name>pattern)和(?’name’pattern)
有时需要多个匹配可以在一个正则表达式中选用子组. 为了让多个子组可以共用一个后向引用数字的问题, (?|语法答允复制数字. 思量下面的正则表达式匹配Sunday:
(?:(Sat)ur|(Sun))day这里当后向引用1空时Sun存储在后向引用2中. 当后向引用2不存在的时候Sat存储在后向引用1中. 利用 (?|修改模式来修复这个问题:
(?|(Sat)ur|(Sun))day利用这个模式, Sun和Sat城市被存储到后向引用1中.