自定义SwiftLint规则问题:// MARK:前换行不足两行排查
关于SwiftLint自定义MARK规则的问题解答
1. SwiftLint是否有内置规则?
目前SwiftLint并没有内置的检测// MARK:前换行数量的规则,你需要通过自定义规则来实现这个需求,你的方向是对的。
2. 你的正则表达式问题在哪?
你写的([^\n\n]?\/\/ MARK:)存在两个关键问题:
- 无效的字符集:
[^\n\n]里重复的\n没有任何意义,正则字符集里重复的字符会被自动忽略,等价于[^\n]?——它只能匹配0个或1个非换行字符,无法检测前面的换行数量。 - 逻辑覆盖不全:这个正则只能匹配
// MARK:前面紧挨着非换行字符的情况(比如func foo() {}// MARK:),但完全漏掉了更常见的错误场景:比如代码行后只隔一个换行就写// MARK:(func foo() {}\n// MARK:),或者// MARK:直接出现在文件开头的情况。
3. 修正后的正则与规则配置
要实现“检测// MARK:前换行少于两行”的需求,我们需要用负向后瞻断言来判断// MARK:前面是否没有连续两个换行。同时注意在YAML配置里,反斜杠需要转义(写成\\):
custom_rules: pragma_mark: name: "Wrong pragma mark format" regex: "(?<!\\n\\n)\\/\\/ MARK:" message: "Please leave two lines before // MARK:" severity: warning
这个正则的逻辑是:匹配所有前面没有连续两个换行的// MARK:,包括:
- 文件开头直接出现的
// MARK: - 代码行后只隔一个换行就出现的
// MARK: - 前面只有单个字符/空格的
// MARK:
如果你的需求是允许// MARK:出现在文件开头(不需要警告),可以把正则调整为:
regex: "(?<!^\\n\\n)(?<!\\n\\n)\\/\\/ MARK:"
不过这个场景比较少见,根据你的需求选择即可。
内容的提问来源于stack exchange,提问作者Severyn Katolyk
相关产品推荐
相关产品推荐

