au3 正则参考 -57-反向引用
<!DOCTYPE html>
正则表达式中的反向引用构造
反向引用为标识字符串中重复字符或子字符串提供方便途径. 例如, 如果输入字符串包含某任意子字符串的多个匹配项, 则可以使用捕获组匹配第一个出现的子字符串, 然后使用反向引用匹配后面出现的子字符串
单独语法用于引用命名的和带编号的捕获组的匹配项替换输入字符串的子字符串. 有关详细信息, 请参阅正则表达式替换.
定义引用编号和已命名的捕获组的单独语言元素. 有关捕获组的详细信息, 请参阅正则表达式中的分组构造.
普通捕获组反向引用: \编号
其中编号是正则表达式中捕获组的序号位置. 例如, \4 匹配第四个捕获组的内容. 如果正则表达式模式中未定义编号, 则将发生分析错误, 并且正则表达式引擎将引发参数异常.
例如,正则表达式 \b(\w+)\s\1 有效, 因为 (\w+) 是表达式中的第一个也是唯一一个捕获组. 另一方面, \b(\w+)\s\2 无效, 并因为不存在捕获组编号 \2 而引发参数异常.
请注意八进制转义代码(如 \16)和使用相同表示法的 \编号 后向引用之间的多义性. 此多义性通过如下方式解决:
1. 表达式 \1 到 \9 总是解释为反向应用, 而不是八进制代码.
2. 如果多位表达式的第一个数字是 8 或 9(如 \80 或 \91), 则该表达式将被解释为文本.
3. 对于编号为 \10 或更大值的表达式, 如果存在与该编号对应的反向引用, 则将该表达式视为反向引用; 否则, 将这些表达式解释为八进制代码.
4. 如果正则表达式包含对未定义的组成员的反向引用, 则会发生分析错误, 并且正则表达式引擎将引发参数异常.
如果有多义性问题, 可以使用 \k
下面的示例查找字符串单词中双写的字符:
字符串: trellis llama webbing dresser swagger
表达式: (\w)\1
匹配结果(标志 4):
[0]=> [0]ll
[1]=> [0]ll
[2]=> [0]bb
[3]=> [0]ss
[4]=> [0]gg
表达式分析:
模式 | 说明 |
---|---|
(\w) | 匹配一个单词字符, 并将其分配给第一捕获组. |
\1 | 匹配下一个字符, 即与第一捕获组相同的字符. 反向引用 . |
命名组的后向引用: \k
name 是正则表达式模式中定义的捕获组名字. 如果正则表达式模式中未定义 name, 则将发生分析错误, 并且正则表达式引擎将引发参数异常.
下面的示例查找字符串中双写的单词字符:
字符串: trellis llama webbing dresser swagger
表达式: (?
匹配结果(标志 4):
[0]=> [0]ll
[1]=> [0]ll
[2]=> [0]bb
[3]=> [0]ss
[4]=> [0]gg
表达式分析:
模式 | 说明 |
---|---|
(? | 匹配单词字符, 并将其分配给名为 char 的捕获组. |
\k | 匹配下一个字符, 即与 char 捕获组相同的字符. 命名组的反向引用 . |
请注意 name 也可以是数字字符串的表示形式. 例如下面的示例使用正则表达式 (?<2>\w)\k<2> 与 (?
反向引用匹配什么
反向引用总是指向最近的定义组(当从左到右匹配时, 最靠近左侧的定义). 当组建立多个捕获时, 反向引用会引用最近的捕获.
如果一个组尚未捕获任何子字符串, 则对该组的反向引用是未定义的并且永远不匹配. 如下面示例:
字符串: AA22ZZ, AABB
表达式: \b(\p{Lu}{2})(\d{2})?(\p{Lu}{2})\b
匹配结果(标志 4):
[0]=> [0]AA22ZZ
[0]=> [1]AA
[0]=> [2]22
[0]=> [3]ZZ
[1]=> [0]AABB
[1]=> [1]AA
[1]=> [2] ; 空匹配 , AABB 之间没有数字 .
[1]=> [3]BB
表达式分析:
模式 | 说明 |
---|---|
\b | 从单词边界开始匹配. |
(\p{Lu}{2}) | 匹配两个大写字母. 这是第一个捕获组. |
(\d{2})? | 匹配两个十进制数的零个或一个匹配项. 这是第二个捕获组 |
(\p{Lu}{2}) | 匹配两个大写字母. 这是第三个捕获组 |
\b | 从单词边界结束匹配. |
即使由第二个捕获组定义的两个十进制数字不存在( 例如子字符串 AABB 之间不存在数字 ) , 输入字符串也可以匹配此正则表达式 .
示例显示即使匹配成功, 仍会在两个成功的捕获组之间找到空捕获组.
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!