如何让vim syn正则表达式用尾随空格捕获单词?

时间:2015-11-22 20:15:34

标签: regex vim vim-syntax-highlighting

我试图制作一个vim正则表达式,在此示例中突出显示单词house,但前提是后跟空格,并且仅当句子以分号结尾时才会显示。

herbert house mouse; bear care; house moose hat; // both instances of house highlighted
cow (house) banana goat; car bar; //house must NOT be highlighted
house beagle //house must NOT be highlighted

来自我的VIM语法文件:

syn match ngzRewLine '\w\+[^;]\{-};' contains=ngzRew
syn keyword ngzRew house contained

除非突出显示(house),否则效果很好。我可以使用什么正则表达式只匹配带有尾随空格和非贪婪结束分号的单词?

修改

总结一下,在以下情况下,ngzRew关键字组中的字词应突出显示:

  • 家鼠;
  • 猫屋老鼠;
  • 香蕉屋;鲶鱼皮鞋;
  • 房子;

以下内容中不应出现任何突出显示:

  • 房子
  • 猫(家)奶酪;
此处使用

house作为示例,但ngzRew关键字组中还有其他关键字,行为应该相同。

2 个答案:

答案 0 :(得分:1)

你可以这样做(这可能不是很方便,但由于以下的空白,我无法想出更好的方法)

highlight MyGroup ctermbg=green guibg=green
syntax match MyGroup /\(house\|car\)\ze\(;\|\s.\{-};\)/

现在它也匹配car

  • \ze在任意位置匹配,并设置匹配结束,
  • \s空白字符,
  • .匹配任何单个字符,
  • \{-}匹配前面原子的0或更多,尽可能少,
  • \(\)大括号可用于将图案制作成原子,
  • \|是"或"运营商的模式。

答案 1 :(得分:1)

@ryuichiro给了我找到答案的所需信息,所以我为此归功于他。但允许无限数量关键字的完整解决方案如下:

syn match ngzRewLine /\w\+\ze\(;\|\s.\{-};\)/ contains=ngzRew contained
syn keyword ngzRew house contained
syn keyword ngzRew cheesecake contained
syn keyword ngzRew ...etc contained