Clang-tidy头文件过滤正则表达式:Makefile -> .clang-tidy

9

我正试图将clang-tidy的硬编码配置选项从我们的Makefile移动到一个.clang-tidy的YAML文件中。目前,我们使用以下命令调用run-clang-tidy-6.0.py:

# Run clang-tidy. The header filter includes files in the foo and bar/baz directories
# but it excludes files ending in .g.h (auto-generated headers).
run-clang-tidy-6.0.py -header-filter='.*(foo|bar\/baz).*(?<!\.g\.h)$$' > clang-tidy-output.txt

这个可以正常工作。但是如果我在.clang-tidy中有HeaderFilterRegex: '.*(foo|bar\/baz).*(?<!\.g\.h)$$',过滤就不能按预期工作。

我尝试了各种不同的方法来编写转义字符,因为我知道Make和YAML对此有不同的期望,但我无法做到完全正确。 例如:

  • 将$$替换为$
  • 双重转义\(\ -> \\\\)
  • 删除''

能否有人向我解释一下如何在YAML文件中正确编写这个正则表达式?


根据上面的评论run-cland-tidy,我正在尝试匹配以foobar/baz开头的路径(排除所有其他目录)。同时不要匹配任何以.g.h结尾的文件,因为这些是自动生成的,不应该通过linter运行。 - Brandon Schaefer
5
虽然我暂时还没有完全可用的正则表达式给你(但),在研究类似问题时,我发现:clang-tidy在其正则表达式中使用Posix ERE语法。ERE文档在这里:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04 - psyill
1
你自己想出了解决方案吗?你的问题的答案是什么? - lumpidu
1个回答

2
据我所知,正则表达式应该在YAML文件中以字符串形式编写,并且反斜杠应该用另一个反斜杠进行转义。在您的情况下,YAML文件应包括:
HeaderFilterRegex: '.*(foo|bar\\/baz).*(?<!\\.g\\.h)$'

在这种情况下,斜杠和点号前面的反斜杠需要用另一个反斜杠进行转义。反斜杠用于转义负回顾断言中美元符号和点号之前的反斜杠。 要在YAML中包围正则表达式,请使用单引号或双引号。如果使用双引号,则必须转义反斜杠和其他几个特定于YAML的符号,例如美元符号。例如:
HeaderFilterRegex: ".*(foo|bar\\/baz).*(?<!\\.g\\.h)$"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接