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)
}