如何匹配评论中没有的字符串?

时间:2014-06-01 23:28:43

标签: regex vim

我在.vimrc中使用以下内容来匹配大写字符串并突出显示它们:

match Macro /\v<[A-Z|_]{2,}>/

但是,我想要匹配评论(即//位于同一行中的文字之前或文本被/*包围的位置和*/)。

如何修改上述内容以实现此目的?

1 个答案:

答案 0 :(得分:3)

我假设您的正则表达式中的|应该表示&#34;或。&#34;它没有:在括号内,没有&#34;或&#34;是必须的。您的|指的是实际字符|

这个正则表达式应该在98%的时间内完成这个技巧,可能更多:

\v(\/\/[^\n]*|\/\*(\_[^*]|\*\_[^/])*)@<!<[A-Z_]{2,}>

它使用正向lookbehind确保同一行中的字符串前面没有//,并且前面没有/*后面没有*/。它在以下情况下失败:

if (string == "/*") { // Looks like the start of a block comment
    return CONSTANT; // Won't be highlighted
}

如果你想要比这更好的结果(也就是说,如果你担心在遇到错误时你会对这个问题有所了解),那么你可以让它变得更加复杂。多么复杂取决于你的语言。例如,在JavaScript中,您需要担心正则表达式文字和字符串:

// Looks like a comment after the "//" in the regex:
if (/\//.test(string)) return CONSTANT; // Won't be highlighted

如果您想了解正则表达式与正则表达式匹配的复杂程度,请查看我的答案here