slass/struct/enum/extension 之后的 SwiftLint 自定义间距规则

SwiftLint Custom Spacing Rule After slass/struct/enum/extension

我通过 https://regex101.com/r/7D6fAL/1 获得了以下正则表达式,但在添加为 swiftlint 自定义规则时无法正常工作。我希望规则在以下条件下触发(在 regex101 中按预期工作):

// should trigger
public final class Aaaaaaa {
var cat: Bool
}

// should not trigger
class Aaa {

var cat: Bool
}

// should not trigger
func bbb {
}

// should trigger
struct Ccc {
}

// should not trigger
struct Ccc {

}

// should trigger
enum Ddd {
}

// should not trigger
enum Ddd {

}

// should trigger
extension Eee {
}

// should not trigger
extension Eee {

}

但是当添加为 swiftlint 自定义规则时,不会触发任何警告:

custom_rules:
  space_after_main_type:
    name: "No space after main type"
    regex: '(class|struct|enum|extension)[\h\S]*{$\n(?!\s)' 
    message: "Empty line required after main declarations"
    severity: warning

感谢 this comment to an issue on the swiftlint repo 解决了这个问题。在这里发布我的答案以防其他人去寻找类似的解决方案并且不想像我一样花几个小时:

(class|struct|enum|extension)((?-s)\s.*\{$\n)(?!^\s*$)

有没有其他方法可以解决这个问题,几乎可以肯定,但我会让比我更聪明的人 post 关于为什么我因为没有弄清楚这些而成为一个傻瓜。 ;)