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

时间:2017-09-12 09:58:20

标签: vim colors syntax-highlighting

要匹配包含正斜杠(/)的行,我们可以在语法文件中使用以下内容

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

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

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

但第一部分覆盖第二部分,如image1所示。 此外,在第1行中,pathA没有着色,如果我使用“\ v。 /。 $”,它将为整行着色。

Image 1

Image 2

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

1 个答案:

答案 0 :(得分:0)

这是一个简单的问题,可以根据您的需要调整正则表达式。

要在pathA之前加入/,您需要匹配它。 .*/.*$将匹配整行(正如您已经发现的那样); .匹配任何(也是空格),*贪心匹配。你必须问自己哪些字符可以包含在 colorpath 中,哪些不能。让我们假设它可以包含任何空格。正则表达式原子是\S(和集合中的等效[^[:space:]])。有了这个,我们到达:

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

第二个问题是这会遮挡 colorpath2 ,因为 colorpath2 colorpath 的子集。我们需要使匹配集合分离,例如:

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

这基本上说:在斜线之前的任何非空格,没有斜线(并且仍然没有空格),然后是单斜线,后面没有斜线,到线的末尾。 上一个命令仅在斜杠之前确实存在路径字符时才有效(因此它在/pathX上失败)。要解决这个问题,我们必须在行的开头添加分支以及在空格之后立即(当然,只有当你的语法实际允许这些地方时):

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

另一种表达方式是使用负面的lookbehind和lookahead ;这样可读性较差,但避免了手动加入\S[^/],就像在上一个命令中一样,并且它会在开始时自动处理单个斜杠的极端情况,而不需要任何其他分支。 / p>

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

这是因为原子只断言匹配,但不消耗任何东西。有关详细信息,请参阅:help /zero-width