代码之家  ›  专栏  ›  技术社区  ›  Eashwar Gadanchi

仅包含/但不包含的syn匹配线//

  •  2
  • Eashwar Gadanchi  · 技术社区  · 7 年前

    匹配包含正斜杠的行( /

    syntax match colorpath "\v/.*$" #highlight link colorpath Comment1
    

    匹配具有双正斜杠的线( // ),我们可以使用相同的语句

    syntax match colorpath2 "\v//.*$" #highlight link colorpath2 Comment2
    

    但第一部分覆盖了第二部分,如图1所示。 此外,在第1行中,如果我使用“\v”,则pathA不着色。 /.

    Image 1

    Image 2

    有没有什么方法可以区分这两条线,如图2所示?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ingo Karkat    7 年前

    这是一个使正则表达式适应您的需要的简单问题。

    包括 pathA / .*/.*$ 将匹配整行(正如您已经发现的);这个 . 任何东西 (也是空白),以及 * 贪婪的 \S (和同等产品) [^[:space:]]

    syntax match colorpath "\S*/.*$"
    

    第二个问题是,这掩盖了 颜色路径2 颜色路径2 是的子集 彩色通道 . 我们需要使匹配集不相交,例如:

    syntax match colorpath "\S*[^/[:space:]]/[^/].*$"
    

    这基本上是说:任何非空白,斜杠之前没有斜杠(仍然没有空白),然后是单斜杠,然后是无斜杠,直到行的末尾。 前一个命令仅在斜杠前确实存在路径字符时有效(因此在 /pathX

    syntax match colorpath "\%(\S*[^/[:space:]]\|^\|\s\zs\)/[^/].*$"
    

    负向后看和向前看 ; 这可读性较差,但避免了手动连接 \S [^/] 与前一个命令一样,它会自动处理起点处单个斜杠的转角情况,而不需要任何其他分支。

    syntax match colorpath "\S*/\@<!//\@!.*$"
    

    :help /zero-width 详细信息。