3月302016
au3 正则参考 -80-表达式的递归匹配
<!DOCTYPE html>
表达式的递归匹配: (?R) 或 (?x)
相对于反向引用来说, 反向引用是在匹配过程中对匹配到的字符串内容进行引用, 而递归匹配是对表达式进行引用. 有时我们需要用正则表达式来分析一个计算式中的括号配对情况. 比如使用表达式 ( [^)] ) 或者 ( .? ) 可以匹配一对小括号. 但是如果括号内还嵌有一层括号的话 , 如 ( ( ) ) , 则这种写法将不能正确匹配, 得到的结果是 ( ( ) . 类似情况的还有 HTML 中支持嵌套的标签如 等.
表达式使用 (?R) 或 (?x)(x=组编号) 递归进入整个正则表达式. 具体格式如下表:
格式 | 说明 | 格式 | 说明 | |
---|---|---|---|---|
(?R) | 对整个表达式的递归引用 | (?R1) 或 (?R2) | 对指定分组的递归引用. | |
(?1) 或 (?2) | 对指定分组的递归引用. | (?R | 对指定命名分组的递归引用 |
下面示例匹配嵌套未知层次的 "小括号对" :
字符串: If StringInStr(FileGetAttrib($current & "\" & $file), "D") And ($file <> "." Or $file <> "..")
表达式: (([^()]|(?R)))
匹配结果(标志 4):
[0]=> [0](FileGetAttrib($current & "\" & $file), "D")
[0]=> [1]"
[1]=> [0]($file <> "." Or $file <> "..")
[1]=> [1]"
表达式分析:
模式 | 子模式 | 说明 |
---|---|---|
( | 转义字符 ( 为本身原意字符 , 匹配一个左园括号 . | |
([^()]|(?R)) | 两个选项的可选表达式 , 分述如下 : | |
[^()] | 选项 1 , 负字符组 . 匹配一个排除左 , 右园括号的其它任意字符 | |
| | 选项分隔符 . | |
(?R) | 选项 2 , 递归进入整个正则表达式 . | |
0 次或多次匹配选项表达式的结果匹配项 . | ||
) | 转义字符 ) 为本身原意字符 , 匹配一个右园括号 . |
几个正在表达式递归示例模式:
表达式 | 等效的表达式1 | 等效的表达式2 | 可以匹配 |
---|---|---|---|
(\w)(?1) | (\w)(\w) | ab | |
(?1)(\w(?2))(\d) | (?1)(\w(\d))(\d) | (\w(\d))(\w(\d))(\d) | a1b23 |
(\w(?1)?) | (\w(\w(?1)?)?) | (\w+) | ghjk5…… |
(([^()]|(?R))) | (([^()]|(([^()]|(?R))))) | (a(c+2)) |
扫描二维码,在手机上阅读
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!