Syn Match Regex Expression用于以冒号结尾的所有行,但不以短划线开头

时间:2011-06-15 17:52:09

标签: regex vim syntax-highlighting

我有一个以下格式的文件:

Abc Task Header:

- task detail a

- task detail b


Def Task Header:

- task detail c:

    - task sub detail c1

    - task sub detail c2

- task detail d

我想让我的语法文件匹配(并突出显示)以下几行:

Abc任务标题:
Def任务标题:

希望以下行匹配并突出显示:

任务明细c:


注意事项:

  • 所有任务标题以字母开头,以冒号结尾。
  • 除了上面列出的任务标题之外,任务标题没有任何一致的命名约定(因此名称中没有Task Header ...这只是一个示例名称)
  • 如果任务详细信息包含子任务详细信息,则可能以冒号结尾。
  • 任务详细信息始终以-(短划线)字符开头。
  • 任务详细信息不缩进。这是使用列表时StackOverflow编辑器的副作用。
  • 显示的所有项目符号实际上都是文件中的-(破折号)。这也是StackOverflow编辑器的副作用。

我尝试了一些东西,但它们似乎没有正常工作。

e.g。

syn match myTask "[A-Z]*:$"

这导致突出显示任务标题的最后一个单词以及冒号。它还突出显示具有冒号的任何任务详细信息。

syn match myTask "[^-].*[A-Z].*:$"

这会突出显示整个任务标题和冒号(想要的行为),但会突出显示包含冒号的任何详细信息。它没有突出显示短划线,但突出显示其余部分。

有什么想法吗?

由于


更新:

嗯,Billy Moon的例子直截了当,涵盖了一直是真实的情景。然而,还有一些其他答案也有效(感谢YGomez)。我会在这里添加一些样本,基于这些或者我从其他答案得到一些灵感后得到的工作(如果其他人正在寻找未来类似问题的解决方案);

syn match myTask "^[^-].*:$"

syn match myTask "[A-Z]*:$"
syn match myTask "^\s*[A-Z].*:$"

// These two are equivalent.
syn match myTask "^\s*[A-Za-Z].*:$"
syn match myTask "^\s*\c\w.*:$"

2 个答案:

答案 0 :(得分:3)

试试这个:

syn match myTask "^[^-].*:$"

答案 1 :(得分:1)

您可以尝试:

syn match myTask "^[A-Z].*:$"

你说他们都以字母开头,所以不要检查它是否以-开头,而是检查它以字母开头的更强的条件(在上面的例子中,是一个大写字母)。

编辑:更多可能的情况:

如果你之前可以有空格:

syn match myTask "^\s*[A-Z].*:$"

如果它也可以是小写的:

syn match myTask "^\s*[A-Za-z].*:$"