如何使"syn-match"规则只在特定位置匹配?



我正在研究日志文件格式的一些Vim语法规则。
我需要一个syn match只匹配之后的一个特定的其他syn match

例如:

我数据:
2021-08-24|  32|  ERR| 032| some_string with nasty s|ymbols §$Q§'äö| 932 ;,,
  • Mysyntax_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与特定列匹配.

包装我们创建一个同时适用于timestamppid的匹配,使其透明并洗牌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

相关内容

  • 没有找到相关文章

最新更新