Swift regex: соответствует ли строка шаблону?

В Swift, что является простым способом увидеть, соответствует ли строка шаблону?

Примеры псевдокода:

if string matches pattern ...

if string =~ pattern ...

(Я прочитал документы Swift и не видел возможности регулярного выражения. Я читал о добавлении нового оператора =~, который является хорошей идеей, но более сложным, чем хотелось бы, потому что это для обучения Я попытался использовать rangeOfString, но получить ошибку: "String" не имеет члена rangeOfString. Я ищу решение Swift, то есть не набираю NSRegularExpression. Мне не нужно ничего делать с данными результата сопоставления.)

Ответы

Ответ 1

Решение Swift версии 3:

if string.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil ...

Решение Swift версии 2:

if string.rangeOfString(pattern, options: .RegularExpressionSearch) != nil ...

Пример. Эта строка содержит два символа "o"?

"hello world".rangeOfString("o.*o", options: .RegularExpressionSearch) != nil

Примечание. Если вы получите сообщение об ошибке 'String' does not have a member 'rangeOfString', добавьте это до: import Foundation. Это потому что  Foundation предоставляет методы NSString, которые автоматически соединяются с классом Swift String.

import Foundation

Благодаря Onno Eberhard для обновления Swift 3.

Ответ 2

Чтобы получить синтаксис, о котором вы действительно спрашиваете, вы можете легко определить новый оператор, который обертывает мостовую функциональность NSString:

infix operator =~ {}
func =~(string:String, regex:String) -> Bool {
    return string.rangeOfString(regex, options: .RegularExpressionSearch) != nil
}

"abcd" =~ "ab*cd"
"abcd" =~ "abcde+"

Ответ 3

Вышеупомянутые решения больше не работали для меня, поэтому я отправляю свое решение здесь (я использовал расширение для String):

extension String {
    func matches(_ regex: String) -> Bool {
        return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil
    }
}

Пример:

if str.matches("^[a-zA-Z0-9._-]{1,30}$") {
    //...
}

Ответ 4

Это вернет, соответствует ли строка шаблону

например. matchesPattern (текст: "sd56Yz", pattern: "[a-zA-Z0-9] +" ) true

например. matchesPattern (текст: "sd56 $Yz", pattern: "[a-zA-Z0-9] +" ) false

func matchesPattern(text: String?, pattern: String?) -> Bool {
    guard hasValue(text) && hasValue(pattern) else {
        return false
    }

    let range = text!.rangeOfString(pattern!, options: .RegularExpressionSearch)

    guard range != nil else {
        return false
    }

    let rangeString = text?.substringWithRange(range!)

    return areEqual(text, string2: rangeString)
}