Sub 条件分支() '1. (?(n)yes|no) - 根据捕获组是否被捕获 '示例:匹配单词或引号内的单词 '(?:"([^"]+)"|(\\w+))(?(1)\\1|\\2) ' 解释: ' "([^"]+)":捕获引号内的内容为 $1 ' (\\w+):捕获普通单词为 $2 ' (?(1)\\1|\\2):如果 $1 已匹配(即有引号),则返回 $1 的内容;否则返回 $2 的内容 '2. (?(+n)yes|no) - 根据相对编号捕获组是否被捕获 '语法:如果相对编号为 +n 的捕获组已被捕获,则匹配 yes;否则匹配 no '示例: 匹配交替出现的字母 '目标:匹配交替出现的字母对,如 ABAB,但只捕获奇数位字母 '^(\\w)(\\w)(?(+1)\\1|\\2)$ '3. (?(<name>)yes|no) - 根据具名捕获组是否被捕获 '示例:匹配不同的引号类型 '目标:匹配单引号 ' 或双引号 " 包围的内容 '(?<quote>'([^']+)')|(?<quote>"([^"]+)")(?(quote)\\1|\\2) ' 解释: ' (?<quote>'([^']+)'):捕获单引号内的内容为 $1,并命名为 quote ' (?<quote>"([^"]+)"):捕获双引号内的内容为 $2,同样命名为 quote ' (?(quote)\\1|\\2):检查是否捕获了 quote 组。如果是(即匹配了单引号),返回 $1;否则返回 $2 '4. (?(R)yes|no) - 根据整体递归是否匹配 '示例:匹配平衡的嵌套结构 '目标:匹配平衡的圆括号 ((())),并检查是否存在递归嵌套 '\\((?:(?(R)\\((?R)\\))|[^()]*)\\) ' 解释: ' \\(:匹配左圆括号 ' (?(R)\\((?R)\\)):如果检测到递归(即内部还有括号),则匹配嵌套结构 ((?R)) ' |[^()]*):否则匹配非括号字符 ' \\):匹配右圆括号 '5. (?(Rn)yes|no) - 根据特定编号分支递归是否匹配 '示例:匹配特定层级的嵌套 '目标:匹配至多两层嵌套的方括号 [[1]],并检查是否超过两层 '\\[(?:(?(?2)\\[(?R)\\])|[^\\[\\]]*)\\] ' 解释: ' \\[:匹配左方括号 ' (?(?2)\\[(?R)\\]):如果检测到第二层递归(?2),则匹配嵌套结构 [(?R)] ' |[^\\[\\]]*):否则匹配非方括号字符 ' \\]:匹配右方括号 '6. (?(R&name)yes|no) - 根据特定具名分支递归是否匹配 '示例:匹配特定标签的嵌套 '目标:匹配 HTML 中 <div> 标签的嵌套,并检查是否存在嵌套 '(?<div><div>(?:(?(R&div)<div>(?R)</div>)|[^<]*)</div>) ' 解释: ' (?<div>...):定义一个名为 div 的分支 ' (?:(?(R&div)<div>(?R)</div>)|[^<]*):如果检测到 div 分支递归成功(即存在嵌套 <div>),则匹配嵌套结构;否则匹配非标签字符 '7. (?(DEFINE)yes|no) - 定义子表达式(仅用于定义,不匹配) '示例:定义复用的模式 '目标:定义一个复用的数字模式 NUM,用于后续匹配 '(?|(?(DEFINE)(?<NUM>\\d+))\\b(?&NUM)\\b) ' 解释: ' (?(DEFINE)(?<NUM>\\d+)):在 DEFINE 中定义一个名为 NUM 的捕获组,匹配数字 ' \\b(?&NUM)\\b:在后续模式中引用 NUM,匹配完整的数字单词 '8. (?(VERSION[>]=n[.m])yes|no) - 根据 PCRE2 版本条件匹配 '语法:如果当前 PCRE2 版本满足条件,则匹配 yes;否则匹配 no。 '示例: 版本特性检测 '目标:根据 PCRE2 版本决定是否使用特定的语法。 '逻辑:如果版本大于等于 10.30,则匹配 yes 部分(使用新语法);否则匹配 no 部分(使用旧语法)。 '(?(VERSION>=10.30)\\b\\w+(?R)\\b|\\b\\w+\\b) '解释: '(VERSION>=10.30):检查 PCRE2 版本是否大于等于 10.30。 '\\b\\w+(?R)\\b:如果是新版本,使用递归模式匹配单词。 '\\b\\w+\\b:如果是旧版本,使用普通单词匹配。 '9. (?(assert)yes|no) - 根据断言结果条件匹配 '语法:如果断言 assert 成功,则匹配 yes;否则匹配 no。 '示例: 正向前瞻条件 '目标:匹配单词 test,但仅当其后面跟随数字 123 时才匹配。 '逻辑:使用前瞻断言检查后续内容,如果成功则匹配 yes 部分(test123),否则匹配 no 部分(仅 test)。 'test(?(?=123)123|) ' 解释: ' (?=123):前瞻断言,检查 test 后面是否跟随 123。 ' (?(?=123)123|):如果断言成功,匹配 123;否则不匹配任何字符(空)。 End Sub
------------------------------------------------------------------------------
Sub 条件表达式()
'1、捕获组条件
' `(?(1)yes-pattern|no-pattern)` - 如果第1个捕获组已匹配则使用yes-pattern
' `(?(<name>)yes-pattern|no-pattern)` - 如果名为name的捕获组已匹配则使用yes-pattern
reg.Pattern = "(\\()?abc(?(1)\\)|123)"
Debug.Print reg.Execute("(abc)123")(0).Value '匹配(abc)
Debug.Print reg.Execute("abc123")(0).Value '匹配abc123
'2、递归条件
' `(?(R)yes-pattern|no-pattern)` - 如果正在递归则使用yes-pattern
' `(?(R1)yes-pattern|no-pattern)` - 如果正在递归第1个组则使用yes-pattern
'3 断言条件
' `(?(?=assertion)yes-pattern|no-pattern)` - 前瞻断言为真时使用yes-pattern
' `(?(?!assertion)yes-pattern|no-pattern)` - 负前瞻断言为真时使用yes-pattern
reg.Pattern = "(?(?=\\d)123|abc)"
Debug.Print reg.Execute("password123").Count '非数字开头,不匹配
Debug.Print reg.Execute("2123abc")(0).Value '数字开头,匹配123
Debug.Print reg.Execute("123abc")(0).Value '数字开头,匹配123
End SubCopyright © 2025- vba.vip All Rights Reserved.