au3 正则参考 -59-捕获组应用限定符
<!DOCTYPE html>
捕获组应用限定符
由正则表达式捕获组匹配的子字符串如下所示:
1. 构造中的第一个组对象( 索引 0 )表示整个匹配.
2. 下一分组对象表示未命名编号的捕获组. 它们以在正则表达式中从左至右出现的顺序定义. 这些组的索引值范围从 1 到组中未命名捕获组的数目.
3. 命名捕获组以它们在正则表达式中从左至右的顺序出现定义 . 这些组的索引值范围从 1 到集合中命名捕获组的数目. 特定组索引等效于其编号的反向引用.
下面的示例描述分组和捕获对象之间的关系:
字符串 : This is a short sentence.
表达式 : (\b(\w+)\W+)+
匹配结果(标志 2):
[0]This is a short sentence.
[1]sentence.
[2]sentence
表达式分析:
模式 | 子模式 | 说明 |
---|---|---|
\b | 在单词边界处开始匹配. | |
(\w+)\W+)+ | 一次或多次匹配跟在一个或多个非单词字符后面的一个或多个单词字符. 这是第一个捕获组. | |
(\w+) | 匹配一个或多个单词字符. 这些字符一起构成一个单词. 这是第二个捕获组 | |
\W+ | 匹配一个或多个非单词字符. |
第一个捕获组 ( 数组索引[1] ) 匹配连同标点符号及其该单词后的空白区域的单词; 第二个捕获组 ( 数组索引[2] ) 匹配不包含标点符号及其后空白区域的单词.
通过对捕获组应用限定符(有关详细信息, 请参阅正则表达式的限定符)可以按两种方式修改每个捕获组之间的关系有两种方式:
1. 如果对捕获组应用 或 ? 限定符(将指定零个或多个匹配项), 则捕获组在输入字符串中可能没有匹配项, 捕获组匹配失败, 返回长度为 0 的空值, 但能确保整个表达式匹配成功.
下面示例进行这方面的演示. 在正则表达式模式 aaa(bbb)ccc 中:
输入字符串没有字符 b 序列, 捕获组 (bbb) 因限定符 可以匹配 0 次(即允许不出现), 使得表达式可以匹配输入字符串 aaaccc , 而该捕获组没有匹配项. 但如果没有限定符 , 则测试提示表达式没有匹配项.
字符串: aaaccc
表达式: aaa(bbb)ccc
匹配结果(标志 1, 或 2, 或 3): [0]aaaccc
2. 限定符可以匹配由捕获组定义模式的多个匹配项. 在此情况下, 值对象的长度和组属性仅包含有关最后捕获的子字符串的信息.
例如下面的正则表达式匹配以句点结束的单个句子. 此表达式使用两个分组构造:
第一个分组构造 ((\w+)\s?) 捕获各个单词以及空白字符; 第二个分组构造 (\w+) 捕获各个单词.
如示例的输出所示, 虽然正则表达式成功捕获 2 个完整句子, 但由于限定符 + 的作用, 使得 2 个分组仅捕获了句子的最后一个单词.
字符串: This is a sentence. This is another sentence.
表达式: \b((\w+)\s?)+.
匹配结果(标志 4):
[0]=> [0]This is a sentence.
[0]=> [1]sentence
[0]=> [2]sentence
[1]=> [0]This is another sentence.
[1]=> [1]sentence
[1]=> [2]sentence
表达式分析:
模式 | 子模式 | 说明 |
---|---|---|
\b | 在单词边界处开始匹配 | |
((\w+)\s?)+ | 匹配项目分述如下. 这是使用限定符的第一捕获组 | |
(\w+) | 匹配 1 或多个单词字符. 这是第二捕获组 | |
\s? | 匹配 0 个或 1 个空白符 | |
+ | 限定符 . 1 次或多次匹配上 2 项的集合 |
捕获集合
组对象仅包含有关最后一个捕获的信息. 但仍可从捕获收集属性返回的捕获组对象中获取由捕获组生成的整个捕获集合. 集合中的每个成员均为一个由该捕获组生成的捕获对象, 这些对象按被捕获的顺序排列(也就是遵循在输入字符串中按从左至右匹配捕获的字符串顺序). 可以通过返回的数组索引来检索集合中的各个捕获对象.
如果不对捕获组应用限定符, 则捕获收集对象将包含一个捕获对象, 但该对象的作用不大, 因为它提供的是有关与其组对象相同的匹配项信息. 如果对一个捕获组应用限定符, 则捕获收集对象将包含该捕获组所生成的所有捕获, 并且集合的最后一个成员将表示与组对象相同的捕获.
例如使用正则表达式 ((a(b))c)+ (限定符 + 指定匹配一个或多个匹配项)捕获字符串 bcabcabc 中的匹配项, 则每个捕获收集对象的组对象都将包含三个成员.
匹配结果(标志 2):
[0]abcabcabc
[1]abc ; 成员 1
[2]ab ; 成员 2
[3]b ; 成员 3
下面示例使用正则表达式 (Abc)+ 在字符串 XYZAbcAbcAbcXYZAbcAb 中查找字符串 Abc 的一个或多个连续匹配项. 该示例演示了使用组捕获属性来返回多组捕获的子字符串.
匹配结果(标志 4):
[0]=> [0]AbcAbcAbc ; 开始于位置 3
[0]=> [1]Abc ; 开始与位置 6
[1]=> [0]Abc ; 开始与位置 6
[1]=> [1]Abc ; 开始与位置 9
单个捕获
捕获来自单个子表达式捕获的结果. 捕获值为匹配的文本.
下面示例分析选定城市温度的输入字符串. 逗号 , 用于将城市名称与其温度值分隔开, 而分号 ; 用于将每个城市的数据分隔开.
用于分析字符串的正则表达式模式 ((\w+(\s\w+)),(\d+);) 中, 城市名称将分配给第二个捕获组( 对应 => [2] ) , 而温度值将分配到第四个捕获组( 对应 => [4] ) .
字符串: Miami,78;Chicago,62;New York,67;San Francisco,59;Seattle,58;
匹配结果(标志 4):
[0]=> [0]Miami,78; [0]=> [1]Miami,78; [0]=> [2]Miami [0]=> [3] [0]=> [4]78 | [1]=> [0]Chicago,62; [1]=> [1]Chicago,62; [1]=> [2]Chicago [1]=> [3] [1]=> [4]62 | [2]=> [0]New York,67; [2]=> [1]New York,67; [2]=> [2]New York [2]=> [3] York [2]=> [4]67 | [3]=> [0]San Francisco,59; [3]=> [1]San Francisco,59; [3]=> [2]San Francisco [3]=> [3] Francisco [3]=> [4]59 | [4]=> [0]Seattle,58; [4]=> [1]Seattle,58; [4]=> [2]Seattle [4]=> [3] [4]=> [4]58 |
---|
表达式分析:
模式 | 子模式1 | 子模式2 | 说明 |
---|---|---|---|
((\w+(\s\w+)),(\d+);) | 匹配以下所有子模式的捕获集合. 是第一个捕获组. | ||
(\w+(\s\w+)) | 0 次 或多次匹配以下子模式2 的捕获集合. 这是第二个捕获组. | ||
\w+ | 匹配一个或多个单词字符. | ||
(\s\w+)* | 匹配一个空白字符后跟 0 个或多个单词字符. 此模式匹配多单词的城市名称. 这是第三个捕获组. 对应 => [3] , 捕获多单词城市名称的最后单词 , 否则为空值 . | ||
, | 匹配逗号. | ||
(\d+) | 匹配一个或多个数字. 这是第四个捕获组. 温度值 , 对应 => [4] . | ||
; | 匹配分号. |
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!