绿色风's Blog
专注AutoIT(Au3)
  • 首页
  • 流●年
  • 笔●记
    • 学习随记
    • 源码示例
  • 脚●本
    • UDF(收集)
    • 工作室UDF
    • 工具●教程
    • 教程之GDI
  • 作●品
  • 下●载
  • 情怀ExcelTip
3月302016

au3 正则参考 -57-反向引用

作者:绿色风   发布:2016-3-30 11:26 Wednesday   分类:工具●教程   阅读:3795次   评论:0条  

<!DOCTYPE html> RegExp

正则表达式中的反向引用构造

反向引用为标识字符串中重复字符或子字符串提供方便途径. 例如, 如果输入字符串包含某任意子字符串的多个匹配项, 则可以使用捕获组匹配第一个出现的子字符串, 然后使用反向引用匹配后面出现的子字符串

单独语法用于引用命名的和带编号的捕获组的匹配项替换输入字符串的子字符串. 有关详细信息, 请参阅正则表达式替换.

定义引用编号和已命名的捕获组的单独语言元素. 有关捕获组的详细信息, 请参阅正则表达式中的分组构造.

普通捕获组反向引用: \编号

其中编号是正则表达式中捕获组的序号位置. 例如, \4 匹配第四个捕获组的内容. 如果正则表达式模式中未定义编号, 则将发生分析错误, 并且正则表达式引擎将引发参数异常.

例如,正则表达式 \b(\w+)\s\1 有效, 因为 (\w+) 是表达式中的第一个也是唯一一个捕获组. 另一方面, \b(\w+)\s\2 无效, 并因为不存在捕获组编号 \2 而引发参数异常.

请注意八进制转义代码(如 \16)和使用相同表示法的 \编号 后向引用之间的多义性. 此多义性通过如下方式解决:

    1. 表达式 \1 到 \9 总是解释为反向应用, 而不是八进制代码.

    2. 如果多位表达式的第一个数字是 8 或 9(如 \80 或 \91), 则该表达式将被解释为文本.

    3. 对于编号为 \10 或更大值的表达式, 如果存在与该编号对应的反向引用, 则将该表达式视为反向引用; 否则, 将这些表达式解释为八进制代码.

    4. 如果正则表达式包含对未定义的组成员的反向引用, 则会发生分析错误, 并且正则表达式引擎将引发参数异常.

如果有多义性问题, 可以使用 \k 表示法, 该表示法是明确的, 并且不会与八进制符号代码混淆. 同样, 如 \xdd 的十六进制代码是明确的, 并且不能与反向引用混淆.

下面的示例查找字符串单词中双写的字符:

字符串: 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

表达式: (?\w)\k

匹配结果(标志 4):
[0]=> [0]ll
[1]=> [0]ll
[2]=> [0]bb
[3]=> [0]ss
[4]=> [0]gg

表达式分析:

模式 说明
(?\w) 匹配单词字符, 并将其分配给名为 char 的捕获组.
\k 匹配下一个字符, 即与 char 捕获组相同的字符. 命名组的反向引用 .

请注意 name 也可以是数字字符串的表示形式. 例如下面的示例使用正则表达式 (?<2>\w)\k<2> 与 (?\w)\k 效果完全相同.

反向引用匹配什么

反向引用总是指向最近的定义组(当从左到右匹配时, 最靠近左侧的定义). 当组建立多个捕获时, 反向引用会引用最近的捕获.

如果一个组尚未捕获任何子字符串, 则对该组的反向引用是未定义的并且永远不匹配. 如下面示例:

字符串: 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 之间不存在数字 ) , 输入字符串也可以匹配此正则表达式 .

示例显示即使匹配成功, 仍会在两个成功的捕获组之间找到空捕获组.






本文固定链接: http://www.jianyiit.com/post-214.html

blogger
该日志由 绿色风 于2016-3-30 11:26 Wednesday发表在 工具●教程 分类下。
版权所有:《绿色风's Blog》 → 《au3 正则参考 -57-反向引用》;
除特别标注,本博客很多文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址;
本文标签:

扫描二维码,在手机上阅读
上一篇::au3 正则参考 -58-可选构造
下一篇:au3 正则参考 -56-非捕获组

热门文章

相关文章

  • AutoIt-API-WS-一个轻量的HTTP服务器,可以用来构建自己的WEB-API
  • au3 正则参考 -41-不区分大小写
  • au3 正则参考 -17-字符串或行结尾
  • au3 正则参考 -45-表达式注释
  • au3 正则参考 -05-负字符组
取消回复

发表评论

亲,头像对么?

34 + 79 =

提交中,请稍候……


木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!


    站点统计
    • 运行时间: 20254 天
    • 日志总数: 365 篇
    • 评论数量: 7238 条
    • 微语数量: 6 条
    • 附件总量: 388 件
  • 逝出的青春

  • 打赏"绿色风"



      扫码关注本站公众号 可搜本站内容

  • Autoit V3 脚本交流群

      常驻群1:905774875
      常驻群2:40672266


  • 链接

    • AU3中文论坛
    • Excel资料库
    • 完美者博客
    • 顺网小哥'S Blog
    • 猛牛哥的博客
    • 网吧系统下载
  • 分类

    • 流●年(66)
    • 笔●记(0)
    • 脚●本(0)
    • 作品(21)
    • 学习随记(51)
    • 源码示例(68)
    • UDF(收集)(26)
    • 工作室UDF(30)
    • 工具●教程(62)
    • 教程之GDI(24)
Copyright © 2013 绿色风's Blog. Powered by emlog. Theme by 射雕天龙. 鄂ICP备2021011689号-1 鄂公网安备42102302000078号 sitemap