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

标签 regex vim

我在我的 .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/

相关文章:

php - 使用正则表达式获取标签内的引​​号

javascript - 将每个捕获的字符替换为 *?

regex - 如何使用单个正则表达式从字符串中删除重复字符的单词?

search - vim、ed 或 sed 对给定文件进行多次搜索和替换

linux - vim imap 自动关闭引号的麻烦

macos - Mac OS X 上的 Vim 插入模式

python - 如何在 python ArgumentParser.add_argument() 中包含正则表达式选项?

regex - 在 VIM 中是否有允许我交换 2 个单词的正则表达式(或任何其他快捷方式)?

bash - 从 zsh 恢复到 bash 后 Vim/Vundle 坏了

c# - 正则表达式匹配完成后删除字符串的不匹配部分 - c#