子组(子模式)
发表日期:2021-07-01 08:57:01 | 来源: | | 浏览(544) 分类:PCRE 正则语法
子组(子模式)
子组通过圆括号分隔界定,并且它们可以嵌套。 将一个模式中的一部分标记为子组(子模式)主要是来做两件事情:
-
将可选分支局部化。比如,模式
cat(arcat|erpillar|)
匹配 ”cat”, “cataract”, “caterpillar” 中的一个,如果没有圆括号的话,它匹配的则是 ”cataract”, “erpillar” 以及空字符串。 -
将子组设定为捕获子组(向上面定义的)。当整个模式匹配后, 目标字符串中匹配子组的部分将会通过 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"
匹配模式 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
这里当后向引用 1 空时Sun
存储在后向引用 2 中。
当后向引用 2 不存在的时候 Sat
存储在后向引用 1中。 使用
(?|
修改模式来修复这个问题:
(?|(Sat)ur|(Sun))day
使用这个模式,
Sun
和 Sat
都会被存储到后向引用 1 中。
- PHP(0)
- PHP杂项(34)
- PHP基础-李炎恢系列课程(20)
- 中文函数手册(0)
- 错误处理 函数(13)
- OPcache 函数(6)
- PHP 选项/信息 函数(54)
- Zip 函数(10)
- Hash 函数(15)
- OpenSSL 函数(63)
- Date/Time 函数(51)
- 目录函数(9)
- Fileinfo 函数(6)
- iconv 函数(11)
- 文件系统函数(81)
- 多字节字符串 函数(57)
- GD 和图像处理 函数(114)
- 可交换图像信息(5)
- Math 函数(50)
- 程序执行函数(11)
- PCNTL 函数(23)
- JSON 函数(4)
- SPL 函数(15)
- URL 函数(10)
- cURL 函数(32)
- 网络 函数(33)
- FTP 函数(36)
- Session 函数(23)
- PCRE 函数(11)
- PCRE 正则语法(19)
- 简介(0)
- 分隔符(0)
- 元字符(0)
- 转义序列(反斜线)(0)
- Unicode 字符属性(0)
- 锚(0)
- 句点(0)
- 字符类(方括号)(0)
- 可选路径(|)(0)
- 内部选项设置(0)
- 子组(子模式)(0)
- 重复/量词(0)
- 后向引用(0)
- 断言(0)
- 一次性子组(0)
- 条件子组(0)
- 注释(0)
- 递归模式(0)
- 性能(0)
- 数组 函数(81)
- 类/对象 函数(18)
- 函数处理 函数(13)
- 变量处理 函数(37)
- SimpleXML 函数(3)
- 杂项 函数(31)
- 字符串 函数(101)