反向引用/回溯

当前位置:首页>正则>反向引用/回溯

反向引用/回溯

Sub 反向引用()
    '数字反向引用
    ' `\\1`, `\\g1`, `\\g{1}` - 引用第1个捕获组
    ' `\\2`, `\\g2`, `\\g{2}` - 引用第2个捕获组
    ' `\\3`, `\\g3`, `\\g{3}` - 引用第3个捕获组
    reg.Pattern = "(ab)(\\1)(\\g1)(\\g{1})"
    Set mc = reg.Execute("ababababc")
    Debug.Print mc(0).Value
    
    '先复习命名捕获组
    ' `(?<name>...)` - Perl命名捕获组
    ' `(?'name'...)` - Perl另一种命名捕获组
    ' `(?P<name>...)` - Python命名捕获组
    
    '命名反向引用
    ' `\\k<name>` - Perl风格的命名反向引用
    ' `\\k'name'` - 单引号语法Perl
    ' `\\k{name}` - .NET语法
    ' `\\g{name}` - 通用命名引用语法Perl语法
    ' `(?P=name)` - Python风格语法
    reg.Pattern = "(?<wd>\\w+)\\s+\\w+\\s+(\\k<wd>)"
    Set mc = reg.Execute("hello world hello")
    Debug.Print mc(0).Value
    
    '相对反向引用
    ' `\\g{-1}`, `\\g{-2}`... - 倒数第1,2个捕获组
    ' `\\g{+1}`, `\\g{+2}`... - 正数第1,2个捕获组(TODO:目前似乎不支持,RegBuddy里也不支持这种语法)
    reg.Pattern = "(x)(y)\\g{1}\\g{-1}"
    Set mc = reg.Execute("`xyxy")
    Debug.Print mc(0).Value
End Sub

-------------------------------------------------------------------------

Sub 回溯()
'  \\n              reference by number (can be ambiguous)
'  \\gn             reference by number
'  \\g{n}           reference by number
'  \\g+n            relative reference by number (PCRE2 extension)
'  \\g-n            relative reference by number
'  \\g{+n}          relative reference by number (PCRE2 extension)
'  \\g{-n}          relative reference by number
'  \\k<name>        reference by name (Perl)
'  \\k'name'        reference by name (Perl)
'  \\g{name}        reference by name (Perl)
'  \\k{name}        reference by name (.NET)
'  (?P=name)       reference by name (Python)
End Sub