您尚未登录。

#1 2014-06-07 19:51:33

cjxgm
忙,却还想养猫?
所在地: 杭州
注册时间: 2011-08-19
帖子: 417
个人网站

vim 里怎样做递归匹配?

PCRE可以写:/(0(?1)*1)/,即匹配 01、0011、000111等等,前面n个0后面就得有n个1才匹配
vim里要怎么写?
因为主要是用于高亮,不是pattern也行
syn region 倒是可以递归:

syn region test start=/0/ end=/1/ contains=test
hi link test Type

但是这样的话,会高亮“000011”,而正确的应该是只有最后的“0011”会高亮而前面的00都不高亮(就是说只有配对成功的才高亮)
0b182720d37e25a6f2697cb581782610326f9e.png

PS:其实是想做这样的高亮:

# 语法
id = /\I\i*/          # identifier
blank = /\s/
pointer = /[*&]/      # pointer or reference
simple_type = id
name = id

template = /</ blank* type_list? blank* />/
type_list = type (blank* /,/ blank* type)*
noptr_type = simple_type blank* template?
ptr_blank = blank* pointer blank*
          | blank+
typed_name = noptr_type ptr_blank name

# 只有在 typed_name 匹配时,才对 noptr_type 做高亮(即,除了 typed_name 以外,其它都相当于是 “contained”)
# 其中 /.../ 表示正则表达式,只有正则式是终结符
# ()|*?+ 的含义与正则式的含义一致(vim里的话与扩展正则式的含义一致)
# “#”号到行末为注释

最近编辑记录 cjxgm (2014-06-07 20:32:21)

离线

#2 2014-06-08 16:38:17

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,917
个人网站

Re: vim 里怎样做递归匹配?

参考一下这个?——http://www.vim.org/scripts/script.php?script_id=4176

离线

#3 2014-06-08 17:06:21

cjxgm
忙,却还想养猫?
所在地: 杭州
注册时间: 2011-08-19
帖子: 417
个人网站

Re: vim 里怎样做递归匹配?

百合仙子 说:

参考一下这个?——http://www.vim.org/scripts/script.php?script_id=4176

这个的话,遇到"("就会着色的吧
我需要的是只有和“)”配对之后才着色

离线

页脚