au3 正则参考 -58-可选构造
<!DOCTYPE html>
正则表达式中的可选构造
可选构造可修改正则表达式以启用两者任一的条件匹配.
利用 | 的可选模式匹配
可以使用竖线 | 字符匹配一系列模式中的任意一种, 字符 | 分隔每种可选模式. 与正字符组相同, | 字符可用于匹配若干单个字符中的任何一个.
下面的示例使用正字符组和两者任一模式查找字符串中 gray 或 grey 单词的匹配项. 在这种情况时使用 | 字符会生成更为详细的正则表达式匹配结果.
字符串: The gray wolf blended in among the grey rocks.
表达式1: \bgr(a|e)y\b
表达式2: \bgr[ae]y\b
表达式1的匹配结果(标志 4):
[0]=> [0]gray
[0]=> [1]a
[1]=> [0]grey
[1]=> [1]e
表达式2的匹配结果(标志 4):
[0]=> [0]gray
[1]=> [0]grey
使用 | 字符的表达式 \bgr(a|e)y\b 分析:
模式 | 说明 |
---|---|
\b | 在单词边界处开始. |
gr | 匹配字符 gr |
(a|e) | 匹配字符 a 或 e |
y\b | 匹配单词边界中的 y . 并且结束一轮匹配过程 . |
字符 | 也可用于多个字符或子表达式(包括文本字符和正则表达式语言元素的任意结合)执行两者任一匹配. (字符组则不提供此功能.)
下面示例使用 | 字符提取美国社会保障号 (SSN 格式为 ddd-dd-dddd 的 9 位数字), 或美国雇主标识号 (EIN 格式为 dd-ddddddd 的 9 位数字).
字符串: 01-9999999 020-333333 777-88-9999
表达式: \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b
匹配结果(标志 3):
[0]01-9999999
[1]777-88-9999
表达式分析:
模式 | 说明 |
---|---|
\b | 在单词边界处开始. |
(\d{2}-\d{7} | 匹配连字符连接的两个十进制数字和七个十进制数字; |
|\d{3}-\d{2}-\d{4}) | 或者也可以 匹配三个十进制数字后接连字符, 后接两个十进制数字, 后接另一个连字符, 然后再接四个十进制数字. |
\b | 在单词边界处结束. |
条件匹配的表达式
此语言元素尝试根据是否可以匹配初始模式来匹配两种模式之一. 语法为: (?(?= 条件模式)yes|no)
条件模式是要匹配的初始模式, yes 是当条件模式匹配成功的要匹配模式, 而 no 是条件模式匹配失败时要匹配的可选模式.
正则表达式引擎将条件模式视为一个宽度为零的断言; 也就是说, 正则表达式引擎在计算条件模式之后, 不再处理输入流的后续数据.
语法构造中 (?=条件模式) 是一个零宽断言. (有关详细信息, 请参阅正则表达式中的分组子表达式. ) 正则表达式引擎将条件模式解释为定位点(有关详细信息, 请参阅正则表达式中的定位点), 或者是包含在 yes 中的子表达式. 否则, 无法匹配 yes 模式.
如果条件模式是命名捕获组或带编号的捕获组, 则可选构造将被解释为捕获测试; 正则表达式引擎不会尝试匹配捕获的子字符串, 而是测试该组是否存在.
下面的示例是利用 | 的两者任一模式匹配上节示例. 它使用条件匹配确定单词边界之后的前三个字符是否是后接一个连字符的两个数字. 如果是, 则将尝试匹配美国雇主标识号 (EIN). 如果不是, 则将尝试匹配美国社会保障号 (SSN).
字符串: 01-9999999 020-333333 777-88-9999
表达式: \b(?(?=\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b
匹配结果(标志 3):
[0]01-9999999
[1]777-88-9999
表达式分析:
模式 | 说明 |
---|---|
\b | 在单词边界处开始 |
(?(?=\d{2}-) | 条件定义. 确定接下来的三个字符是否由两个数字后接一个连字符组成. |
\d{2}-\d{7} | 如果前面的条件模式匹配, 则匹配后接一个连字符和七个数字的两个数字 |
|\d{3}-\d{2}-\d{4}) | 如果前面的模式不匹配, 则匹配三个十进制数字, 后接一个连字符, 再接两个十进制数字, 再接另一个连字符, 再接四个十进制数字. |
\b | 在单词边界处结束 |
基于有效捕获组的条件匹配
此语言元素尝试根据是否已经匹配指定的捕获组来匹配两种模式之一. 语法为: (?( name )yes|no) 或 (?(number )yes|no)
其中, name 是捕获组的名称, number 是捕获组的编号; yes 是当 name 或 number 具有匹配项时要匹配的表达式; 否则匹配 no 的可选表达式
如果 name 与正则表达式模式中所用捕获组的名称不对应, 则意味着条件模式的计算结果为 false. 如果 number 与正则表达式模式中所用编号的捕获组不对应, 则正则表达式引擎将引发参数异常.
下面的示例是上示例的变体. 它使用一个名为 n2 的捕获组, 其中包含两个数字, 后接一个连字符. 可选构造测试此捕获组是否在输入字符串中找到匹配项. 如果有匹配项, 则可选构造会尝试匹配九位数的美国雇主标识号 (EIN). 如果没有匹配项, 则将尝试匹配九位数的美国社会保障号 (SSN).
字符串: 01-9999999 020-333333 777-88-9999
表达式: \b(?
匹配结果(标志 4):
[0]=> [0]01-9999999
[1]=> [0]777-88-9999
表达式分析:
模式 | 说明 |
---|---|
\b | 在单词边界处开始. |
(? | 匹配两个数字后接一个连字符的零或一个匹配项. 命名此捕获组 n2 |
(?(n2) | 测试输入字符串中是否有 n2 的匹配项 |
\d{7} | 如果找到 n2 的匹配项, 则匹配 7 个十进制数字 |
|\d{3}-\d{2}-\d{4}) | 如果未找到 n2 的匹配项, 则匹配 3 个十进制数字, 后接一个连字符, 再接 2 个十进制数字, 再接另一个连字符, 再接 4 个十进制数字. |
\b | 在单词边界处结束. |
下面示例中是上示例的变体, 使用编号组而非命名组:
字符串: 01-9999999 020-333333 777-88-9999
表达式: \b(\d{2}-)*(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b
匹配结果(标志 4):
[0]=> [0]01-9999999
[1]=> [0]777-88-9999
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!