我在我的 .vimrc
中使用以下内容匹配大写字符串并突出显示它们:
match Macro /\v<[A-Z|_]{2,}>/
但是,我不想匹配注释(即,//
在同一行中的文本之前,或者文本被 /*
和 */
包围。 )。
如何修改上述内容以实现此目的?
最佳答案
我假设您的正则表达式中的 |
应该表示“或”。事实并非如此:在括号内,不需要“或”。您的 |
指的是实际字符 |
。
这个正则表达式应该能在大约 98% 的时间内完成任务,甚至更多:
\v(\/\/[^\n]*|\/\*(\_[^*]|\*\_[^/])*)@<!<[A-Z_]{2,}>
它使用正向后查找来确保同一行中的字符串前面没有 //
,并且前面没有 /*
后面没有 */
。在以下情况下会失败:
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 .
关于regex - 如何匹配评论中没有的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985528/