au3 正则参考 -53-条件判断捕获组
<!DOCTYPE html>
条件判断捕获组 (?(?=条件模式)yes 模式|no 模式) 或 (?(name)yes 模式|no 模式)
对于(?(?=条件模式)yes|no) , 如果条件表达式 (?=条件模式) 匹配成功, 则匹配 yes 子表达式, 否则匹配 no 子表达式.
对于 (?(name)yes|no) , 如果命名捕获组 name 有捕获, 则匹配 yes 子表达式, 否则匹配 no 子表达式.
如果 条件模式 与可能出现的命名捕获组的组名相同, 为避免混淆, 可以采用 (?(?=条件模式)yes|no) 方式显示声明 条件模式 为子表达式, 而不是捕获组名.
(?(?=条件模式)yes|no) 验证当前位置右侧是否能够匹配 条件模式 , 属于顺序断言结构, 是零宽度的, 所以它只参与判断, 即使匹配成功, 也不会占有字符.
下表录入 AutoIt 帮助 StringRegExp() 函数文档的相关描述:
其中 (条件模式) 可以是任何以下形式:
(n) | 测试捕获组是否与绝对数 n 匹配. |
(+n) | 测试捕获组是否与相对数 +n 匹配. |
(-n) | 测试捕获组是否与相对数 -n 匹配. |
( | 测试捕获组是否与名称 name 匹配 |
(R) | 测试捕获组是否发生任何种类的递归. |
(Rn) | 测试捕获组最近递归是否为绝对数 n. |
(R&name) | 测试捕获组最近递归名称是否为 name. |
(DEFINE) | 如果省略 no 子模式, 允许使用其它地方定义的子程序. "(?x) (?(DEFINE) (? 实际地址可由 "\b (?&byte) (.(?&byte)){3} \b" 匹配. |
(assertion) | 断言为正数或负数, 断言为预取或后处理之一. |
捕获组的条件判断计算: (?(条件模式)yes| no ) 和 (?(name)yes| no ),
其中条件模式是要匹配的子表达式, name 是捕获组的名称; yes 是当条件模式, 或 name 匹配成功时要匹配的字符串; 而 no 是当条件模式, 或 name 匹配无效时要匹配的子表达式.
此功能允许引擎根据前面的条件模式匹配的结果, 或零宽度断言的结果, 使用多个替换模式进行搜索. 这提供了超越反向引用所允许的, 更为强大的功能.
下面的示例中的正则表达式匹配输入文本中供公用和内部使用的段落. 仅供内部使用的段落以
正则表达式模式 (?m)^(?
字符串:
But this is for public consumption.
匹配结果(标志 3):
[0]
[1]This is not for public consumption.
[2]consumption.
[3]
[4]
[5]
[6]But this is for public consumption.
[7]consumption.
[9]Again, this is confidential.
[10]confidential.
表达式分析:
模式 | 说明 |
---|---|
(?m) | 使用多行模式, 其中 ^ 和 $ 匹配每行的开头和末尾(不是输入字符串的开头和末尾). 有关更多信息, 请参见单行与多行模式. |
^ | 从行的开头开始匹配. |
(? | 匹配后跟空格字符的字符串 |
(?(Pvt)((\w+\p{P}?\s)+) | 如果 Pvt 捕获组存在, 则匹配一个或多个以下模式: 一个或多个单词字符, 后跟零个或一个标点分隔符, 再后跟一个空格字符. 将子字符串分配给第一个捕获组. |
| | yes 与 no 的子模式分隔符 |
((\w+\p{P}?\s)+)) | 如果 Pvt 捕获组不存在, 则匹配一个或多个以下模式: 一个或多个单词字符, 后跟零个或一个标点分隔符, 再后跟一个空格字符. 将子字符串分配给第三个捕获组. |
\r?$ | 匹配行尾或字符串的结尾. |
示例:
字符串: abc
表达式: (?(?=a)\w{2}|\w)
匹配结果(标志 1 或 2): [0]ab
模式 | 说明 |
---|---|
(?(?=a)\w{2}|\w) | 条件判断捕获组, 当前位置右侧如果是字符 " a ", 则整体表达式匹配两个 \w , 否则匹配一个 \w |
(?(?=a) | 条件表达式, 指定当前位置右侧字符为 a |
\w{2} | yes 子表达式, 如果条件成立, 则整体表达式匹配两个 \w ( 2 个字母字符) |
|\w) | no 子表达式 , 否则匹配一个 \w (字符串的第 1 个字母字符) |
另一示例参阅可选构造中的条件匹配的表达式.
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!