au3 正则参考 -51-普通捕获组
<!DOCTYPE html>
普通捕获组: (子表达式)
子表达式为任何有效正则表达式模式. 捕获组编号按正则表达式中左括号从左到右的顺序从 1 开始自动编号. 编号为 0 的捕获是整个正则表达式模式匹配的文本.
正则表达式可以反向引用普通捕获组. 语法 \0 - \9 , 在同一正则表达式中引用匹配的子表达式, 其中数字是未命名捕获组的编号.
普通捕获组返回一个组收集对象, 该对象包含多个组对象, 这些对象表示捕获组的单个匹配项. 集合中的第一个组对象(对应数组索引 [0])表示整个表达式的匹配项. 此对象后面的每个对象均表示一个捕获组的结果.
可以使用组属性检索集合中的各个组收集的项对象. 在集合中按未命名组的序号位置来检索未命名组, 也可以按命名组的名称或序号位置来检索命名组.
未命名捕获组将首先在集合中显示, 并将按照未命名捕获在正则表达式模式中出现的顺序从左至右对它们进行索引. 在对未命名捕获进行索引后, 再将按照命名捕获组在正则表达式模式中出现的顺序从左至右对它们进行索引.
若要确定在特定的正则表达式匹配方法返回的集合中哪些编号的组可用, 可以调用实例的组编号. 若要确定集合中哪些命名的组可用, 可以调用实例的组名称. 这两种方法都对分析任何正则表达式找到匹配的通用程序特别有用.
组收集项可以按索引(对于命名组, 可以按名称)访问各个组对象.
下面的示例定义一个正则表达式, 该表达式使用分组构造捕获日期的年, 月, 日部分.
字符串: Born: July 28, 1989
表达式: \b(\w+)\s(\d{1,2}),\s(\d{4})\b
匹配结果(标志 2):
[0]July 28, 1989
[1]July
[2]28
[3]1989
表达式分析:
模式 | 说明 |
---|---|
\b | 在单词边界处开始匹配. |
(\w+) | 匹配一个或多个单词字符. 这是第一个捕获组. 对应数组索引 [1] , 月份 |
\s | 与空白字符匹配 |
(\d{1,2}) | 匹配一个或两个十进制数字. 这是第二个捕获组. 对应数组索引 [2] 日数 |
, | 匹配逗号 |
\s | 与空白字符匹配 |
(\d{4}) | 匹配四个十进制数字. 这是第三个捕获组. 对应数组索引 [3] 年号 |
\b | 在单词边界处结束匹配 |
下面示例使用嵌套的分组构造来将子字符串捕获到组中. 正则表达式将子字符串 ab 分配给第一个捕获组, 并将子字符串 b 分配给第二个捕获组.
字符串: abc
表达式: (a(b))c
匹配结果(标志 2): [0]abc [1]ab [2]b
表达式分析:
模式 | 子模式 | 说明 |
---|---|---|
(a(b)) | 匹配字符 ab . 这是第一捕获组. 对应 [1]. | |
(b) | 匹配字符 b . 这是第二捕获组. 对应 [2]. | |
c | 匹配字符 c . |
以下示例匹配文本中重复单词的正则表达式. 正则表达式模式的两个捕获组( 对应 [0]=> [0]that that 和 [1]=> [0]the the )表示重复单词的两个实例.
字符串: He said that that was the the correct answer.
表达式: (\w+)\s(\1)\W
匹配结果(标志 4):
[0]=> [0]that that
[0]=> [1]that
[0]=> [2]that
[1]=> [0]the the
[1]=> [1]the
[1]=> [2]the
表达式分析:
模式 | 说明 |
---|---|
(\w+) | 匹配一个或多个单词字符. 这是第 1 捕获组 |
\s | 与空白字符匹配. |
(\1) | 与第 1 捕获组捕获中的字符串匹配. 这是第 2 捕获组. 该示例将匹配值指定到捕获组, 以便重复单词的开始位置可从返回数组中检测. |
\W | 匹配包括空格和标点符号的一个非单词字符. 这样可以防止正则表达式模式匹配第 1 捕获组单词开头的单词. 防止重复匹配 . |
普通捕获组编号规则
编号规则指的是以数字为捕获组进行编号的规则, 在普通捕获组或命名捕获组单独出现的正则表达式中, 编号规则比较清晰,
在普通捕获组与命名捕获组混合出现的正则表达式中, 捕获组的编号规则稍显复杂. 参见普通捕获组与命名捕获组混合编号
需要说明的是, 编号为 0 的捕获组, 指的是整体正则表达式的匹配结果.
如果没有显式为捕获组命名, 即没有使用命名捕获组, 那么需要按数字顺序来访问所有捕获组. 在只有普通捕获组的情况下, 捕获组的编号是按照 "(" 出现的顺序, 从左到右, 从 1 开始进行编号的 .
表达式: (\d{4})-(\d{2}-(\d\d)) 组编号:
上面的正则表达式可以用来匹配格式为 yyyy-MM-dd 的日期, 为了在下表中得以区分, 月和日分别采用了 \d{2} 和 \d\d 这两种写法.
用以上正则表达式匹配字符串: 2016-02-01. 选择标志 4, 测试匹配结果为:
组编号 | 组模式 | 匹配结果 |
---|---|---|
0 | (\d{4})-(\d{2}-(\d\d)) | [0]=> [0]2016-02-01 |
1 | (\d{4}) | [0]=> [1]2016 |
2 | (\d{2}-(\d\d)) | [0]=> [2]02-01 |
3 | (\d\d) | [0]=> [3]01 |
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!