反向引用/回溯

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

反向引用/回溯

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