Регулярное выражение для пользовательского правила swiftlint

Я создаю собственные правила в программе swiftlint.
Это моя ссылка: https://github.com/realm/SwiftLint

Я хотел добавить пользовательское правило, в котором я должен обнаруживать 2 или более пробелов после ','. Поэтому я добавил это правило.

comma_space_rule:
  regex: ",[ ]{2,}"
  message: "Expected only one space after ',"

Но это не работает. Помощь swiftlint не очень помогает. Также github не упоминает правила регулярных выражений.

Итак, я изучил формат регулярных выражений Swift, и, похоже, все в порядке. Я что-то упустил здесь?


person mythicalcoder    schedule 03.04.2016    source источник
comment
Не знаю, сработает ли это, но вы можете попробовать это , +..Есть один space, а затем (space)+   -  person rock321987    schedule 03.04.2016
comment
Спасибо. Но не сработало.   -  person mythicalcoder    schedule 03.04.2016
comment
Вам удалось разобраться? Кажется, не удается заставить работать какое-либо пользовательское правило... Наконец удалось заставить его работать, оставив только пользовательское правило в .yml и удалив все остальное...   -  person Lescai Ionel    schedule 03.08.2016
comment
Нет, другого способа я не придумал. Я проверю, оставив только пользовательские правила.   -  person mythicalcoder    schedule 04.08.2016


Ответы (2)


Ваше пользовательское правило работает для меня. Вот шаги, которые я выполнил:

Добавил .swiftlint.yml в тот же каталог, что и мой файл .xcodeproj со следующим содержимым:

custom_rules:
  comma_space_rule:
    regex: ",[ ]{2,}"
    message: "Expected only one space after ',"

В проект Xcode добавлена ​​новая «Этап выполнения сценария»:

if which swiftlint >/dev/null; then
    swiftlint
else
    echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

Building дает мне ожидаемое предупреждение.

person Community    schedule 12.05.2016

Создание пользовательских правил с помощью SwiftLint затруднено, так как нет уровня проверки, как в случае с тестами для «обычных» правил. Вместо этого попробуйте AnyLint, который написан именно для решения этой проблемы. Он написан на Swift, но работает на любом языке, поскольку основан на регулярных выражениях.

Ваш вариант использования будет выглядеть так в AnyLint:

// MARK: CommaSpace
try Lint.checkFileContents(
    checkInfo: "CommaSpace: Expected only one space after a comma.",
    regex: #", {2,}"#,
    matchingExamples: ["[1,  2]", "obj.foo(x,    y)"],
    nonMatchingExamples: ["[1, 2]", "obj.foo(x, y)"],
    includeFilters: [#".*\.swift"#]
)

С AnyLint вы даже можете указать autocorrectReplacement для автоисправления, например:

// MARK: CommaSpace
try Lint.checkFileContents(
    checkInfo: ... // same parameters as above, plus:
    autoCorrectReplacement: ", ",
    autoCorrectExamples: [
        ["before": "[1,  2]", "after": "[1, 2]"],
        ["before": "obj.foo(x,    y)", "after": "obj.foo(x, y)"],
    ]
)

Надеюсь, это поможет.

person Jeehut    schedule 24.04.2020