au3 正则参考 -52-命名捕获组
<!DOCTYPE html>
命名捕获组 : (?子表达式) 或 (?'name' 子表达式)
其中名称是有效的捕获组名称, 名称不得包含任何标点符号字符, 并且不能以数字开头. 而子表达式是任何有效的正则表达式模式.
正则表达式可以反向引用命名捕获组. 语法 \k<名称> , 在同一正则表达式中引用匹配的子表达式, 其中名称是命名捕获组的名称.
命名组可以通过编程方式, 或通过正则表达式语言语法引用已命名的组.
正则表达式 ((?
字符串: abc123xyz258gef,
表达式: ((?
选择标志 4 的匹配结果按编号和名称产生下列捕获组:
数字 | 组名称 | 模式及其捕获内容 |
---|---|---|
0 | 默认名称 0 | ((? |
1 | 默认名称 1 | ((? |
2 | One | (? |
3 | Two | (? |
4 | 默认名称 4 | (.) 匹配结果 : [0]=> [4]258gef, |
下面示例标识文本字符串中重复的单词, 重复单词紧随的单词. 正则表达式模式定义了两个命名的子表达式: duplicateWord, 它表示重复的单词; 和 nextWord, 它表示重复单词后面跟随的单词.
字符串: He said that that was the the correct answer.
表达式: (?
匹配结果(选择标志 3):
[0]that ; 位置 8 开始的重复单词.
[1]was ; 其后紧随的单词.
[2]the ; 位置 22 开始的重复单词.
[3]correct ; 其后紧随的单词.
表达式分析:
模式 | 说明 |
---|---|
(? | 匹配一个或多个单词字符. 命名此捕获组名称为 duplicateWord |
\s | 与空白字符匹配. |
\k | 匹配名为 duplicateWord 的捕获组. \k 表示引用先前捕获组的名称. |
\W | 匹配包括空格和标点符号的一个非单词字符 |
(? | 匹配一个或多个单词字符. 命名此捕获组名称为 nextWord |
下面示例的正则表达式 \D+(?
字符串: abc123def456abc123def
表达式: \D+(?
匹配结果(标志 4):
[0]=> [0]abc123def456
[0]=> [1]123
[0]=> [2]456
[1]=> [0]abc123def
[1]=> [1]123
表达式分析:
模式 | 说明 |
---|---|
\D+ | 匹配一个或多个非十进制数字字符 |
(? | 匹配一个或多个十进制数字字符. 将匹配值分配到 digit1 命名组. |
\D+ | 匹配一个或多个非十进制数字字符 |
(? | 匹配一个或多个十进制数字字符的 0 个或一个匹配项. 将匹配值分配到 digit2 命名组. |
下面的示例使用命名的分组构造, 从包含 “数据分析:值” 格式的数据字符串中捕获子字符串, 正则表达式通过冒号 : 拆分数据:
字符串: Section1:119900
表达式: ^(?
匹配结果(标志 3):
[0]Section1
[1]119900
表达式分析:
模式 | 说明 |
---|---|
^ | 从输入字符串的开头部分开始匹配. |
(? | 匹配一个或多个单词字符. 此捕获组的名称为 name |
: | 匹配冒号. |
(? | 匹配一个或多个单词字符. 此捕获组的名称为 value |
命名捕获组编号规则
命名捕获组为显式命名, 通过组名可以访问指定的组, 而不需要去一个个的数编号, 同时避免了在正则表达式扩展过程中, 捕获组的增加或减少对引用结果导致的不可控.
不过容易忽略的是, 命名捕获组也参与了编号的, 在只有命名捕获组的情况下, 捕获组的编号也是按照 "(" 出现的顺序, 从左到右, 从 1 开始进行编号的 . 编号为 0 的第一个捕获组总是指整个模式的匹配结果.
例如正则表达式: (?
用以上正则表达式匹配字符串: 2016-03-01. 选择标志 4, 测试匹配结果为:
编号 | 命名 | 捕获组 | 匹配内容 |
---|---|---|---|
0 | (? | [0]=> [0]2016-03-01 | |
1 | year | (? | [0]=> [1]2016 |
2 | date | (? | [0]=> [2]03-01 |
3 | day | (? | [0]=> [3]01 |
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!