正则表达式为SwiftLint自定义规则不匹配

时间:2018-02-03 01:00:04

标签: swift xcode swiftlint

我已经创建了正则表达式来确定一个类后面是否有一个空行。在xcode中搜索时,这非常有效。但是,swiftlint似乎不能正常工作。

规则是:

custom_rules:
  space_after_class:
    name: "No Space After Class"
    message: "Empty line required after class declarations"
    regex: '(^(open|internal|private|public)*class\s(?!func).*\{$\n(?!^\s*$))'
    severity: error

在xcode / sublime / whatever中搜索时工作正常,但由于某种原因,在swiftlint中返回所有类声明(即使是那些带有新行的声明)

搜索示例: enter image description here

规则示例(注意空白行 - 使用ctrl + f找不到相同的正则表达式): enter image description here

导致这种情况的swiftlint正则表达式有何不同?

2 个答案:

答案 0 :(得分:0)

您的yml文件需要正确格式化。尝试使用任何Yaml验证器在线验证它。 似乎您的正则表达式需要用引号“代替`。

答案 1 :(得分:0)

使用SwiftLint创建自定义规则很困难,因为没有验证级别,就像对“正常”规则的测试一样。尝试使用AnyLint来解决此问题。它是用Swift编写的,但由于基于正则表达式,因此可用于任何语言。

您的用例在AnyLint(我已修复您的正则表达式)中如下所示:

// MARK: SpaceAfterClass
try Lint.checkFileContents(
    checkInfo: "SpaceAfterClass: Empty line required after class declarations.",
    regex: #"^((?:open |internal |private |public )?(?:final )?class (?!func)[^\n]+\{\n)(?!\s*\n)"#,
    matchingExamples: ["class MyClass {\n  let", "public final class MyClass {\n  let"],
    nonMatchingExamples: ["class MyClass {\n\n  let", "public final class MyClass {\n\n  let"],
    includeFilters: [#".*\.swift"#]
)

使用AnyLint,您甚至可以像这样提供autocorrectReplacement进行自动校正:

// MARK: SpaceAfterClass
try Lint.checkFileContents(
    checkInfo: ... // same parameters as above, plus:
    autoCorrectReplacement: "$1\n",
    autoCorrectExamples: [
        ["before": "class MyClass {\n  let", "class MyClass {\n  let"],
        ["before": "class MyClass {\n  let", "class MyClass {\n\n  let"],
    ]
)

我希望这会有所帮助。