我正在研究日志文件格式的一些Vim语法规则。
我需要一个syn match
只匹配之后的一个特定的其他syn match
例如:
我数据:2021-08-24| 32| ERR| 032| some_string with nasty s|ymbols §$Q§'äö| 932 ;,,
- My
syntax_def.vim
:
syn match traceLine '^p*$' contains=timestamp,pid,name,line,string
syn match timestamp 'dddd-dd-dd' contained nextgroup=pid
syn match pid '(|s*d+)@>' contained nextgroup=name
syn match name '|a+s*' contained nextgroup=line
syn match line '|s*d+' contained nextgroup=string
syn match string '|p+' contained
我的问题是规则pid
匹配多次在这一行。
我只想在之后匹配一次timestamp
,然后不再。
同样适用于line
。我怎么解决这个问题?
nextgroup=
基本上只是一个提示,在其他任何事情之前尝试给定组。
要获得所需的结果,您有两个选项:wrapper match或与特定列匹配.
包装我们创建一个同时适用于timestamp
和pid
的匹配,使其透明并洗牌contains=
的参数:
syn match traceLine '^p*$' contains=timestamp_n_pid,name,line,string
syn match timestamp_n_pid 'dddd-dd-dd|s*d+' contained contains=timestamp,pid transparent
与特定列匹配
(此方法假设date
从第一列开始)
由于date
总是格式化XXXX-XX-XX
,即它是10个字符宽,我们知道pid
从第11列开始。然后我们可以在RegEx中通过在开头添加%11c
来指定它:
syn match pid '%11c(|s*d+)@>' contained nextgroup=name