Vim Regex:两个正则冲突的

时间:2017-11-16 17:19:32

标签: regex vim vim-syntax-highlighting

在尝试为内部语言编写语法文件时,我试图捕获前面带有/的每一行的第一个字,并将其分配给一个{ {1}}以及每行的第二个字(由hi def link/括起)并将其分配给第二个/

语法:

hi def link

我正在尝试将cmo/create/mo1///tri createpts/brick/xyz/2,2,2/0.,0.,0./1.,1.,1./1,1,1 cmo捕获为createpts,将argOnecreate捕获为brick

argTwo

问题在于它们存在冲突:当两个syn match argOne '^\zs[^\/]\+\ze\/' syn match argTwo '^[^\/]\+\/\zs[^\/]\+\ze\/' hi def link argOne Type hi def link argTwo Statement 语句都存在时,ViM仅捕获sys match找到的语句。但是在孤立的情况下,当两个argOne中的一个被注释掉时,syn matchargOne将完美无缺。

我怎样才能让这两个陈述相互配合?

2 个答案:

答案 0 :(得分:1)

一种解决方案是创建包含的匹配项,定义与前两个参数匹配的argOneTwo,然后为第一个和第二个匹配项提供匹配项:

syn match argOne '^\zs[^\/]\+\ze' contained
syn match argTwo '\/\zs[^\/]\+\ze\/' contained
syn match argOneTwo '^\zs[^\/]\+\/[^\/]\+\ze\/' contains=argOne,argTwo

hi def link argTwo         Statement
hi def link argOne         Type

答案 1 :(得分:1)

您可以使用syntax match argOne "^[^/\\]\+" nextgroup=sepOne syntax match sepOne "/" contained nextgroup=argTwo syntax match argTwo "[^/\\]\+" contained 构建匹配的语法组序列。这比@hebert的定义包含单个语法组的父组的解决方案更好。

sepOne

请注意,argTwocontained具有nextgroup=...属性,因此仅在通过import keras import sklearn from keras import losses from sklearn import svm 指示时才匹配它们。没有它,它们将匹配更多的位置。