RegEx в Swift?

Я изучаю Свифт, и у меня есть (другой) вопрос. Существуют ли регулярные эпсионы в Swift, и если да, то как их использовать?

В моих исследованиях я нашел некоторую противоречивую информацию. В документах Apple Developer есть что-то, упоминающее RegEx, но оно выглядит так, как любой другой язык, который я видел. Если это решение, как его использовать?

Этот веб-сайт, с другой стороны, предполагает, что RegEx не существует в Swift. Правильно ли это?

В случае, если это помогает, я пытаюсь использовать регулярное выражение, чтобы получить среднюю цену биткойна из API в стиле JSON, который содержит цену, но также много чего не хочу.

Извините за другой основной вопрос.

Ответы

Ответ 1

К сожалению, Swift не имеет регулярных выражений. Но внешняя ссылка, на которую вы ссылаетесь, предоставляет два способа использования регулярных выражений.

  • Создайте оболочку класса вокруг NSRegularExpression и используйте этот класс.
  • Вызов метода Foundation rangeOfString:options: с RegularExpressionSearch как опция. Это в Свифт.

Второй способ чище и проще реализовать.

Определение метода метода в Swift

func rangeOfString(_ aString: String!,options mask: NSStringCompareOptions) -> NSRange

Вы можете использовать его с регулярным выражением как:

let myStringToBeMatched = "ThisIsMyString"
let myRegex = "ing$"
if let match = myStringToBeMatched.rangeOfString(myRegex, options: .RegularExpressionSearch){
    println("\(myStringToBeMatched) is matching!")
}

Здесь документация Apple на rangeOfString()

Ответ 2

Я столкнулся с той же проблемой. Итак, я написал небольшую обертку - https://gist.github.com/ningsuhen/dc6e589be7f5a41e7794. Добавьте в проект проект Regex.swift и добавьте фреймворк Foundation, если он еще не добавлен. После этого вы можете использовать методы replace и match следующим образом.

"+91-999-929-5395".replace("[-\\s\\(\\)]", template: "") //replace with empty or remove
"+91-999-929-5395".match("[-\\s\\(\\)]") //simple match - returns only true or false, not the matched patterns.

Ответ 3

Еще один простой способ - использовать NSPredicate, если вы заинтересованы в чистой проверке (true/false):

Здесь быстрое Regex соответствует канадскому почтовому индексу:

func isCAZipValid(_ zip: String) -> Bool {
    return NSPredicate(format: "SELF MATCHES %@", "^([A-Z]\\d[A-Z])(\\s|-)?(\\d[A-Z]\\d)$")
             .evaluate(with: zip.uppercased())                
}

Ответ 4

Swift не имеет регулярного выражения, поэтому вам нужно будет реализовать класс-оболочку самостоятельно или использовать некоторую библиотеку, подобную этой, которая реализует класс Regex http://www.dollarswift.org/#regex