.characters
ушли.Вы можете использовать непосредственно саму строку.
Изменить self.characters.indices
на self.indices
Изменить self.rangeOfString(expression, options: NSString.CompareOptions.RegularExpressionSearch, range: nil, locale: nil)
на self.range(of: expression, options: .regularExpression, range: nil, locale: nil)
И, наконец, вы можете использовать NSRegularExpression
вместо рекурсивного вызова функции, но учтите, что она может throw
содержать некоторые ошибки, поэтому вам следует как-то ее обработать.Используйте это расширение:
extension String {
func stringsMatchingRegularExpression(expression regex: String) throws -> [String] {
let regex = try NSRegularExpression(pattern: regex)
let results = regex.matches(in: self,
range: NSRange(self.startIndex..., in: self))
return results.map {
String(self[Range($0.range, in: self)!])
}
}
}
- Более Swifty-Style:
extension String {
func matching(expression regex: @autoclosure () throws -> NSRegularExpression) rethrows -> [String] {
let results = try regex().matches(in: self, range: NSRange(self.startIndex..., in: self))
return results.map {
String(self[Range($0.range, in: self)!])
}
}
func matching(pattern regexPattern: String) throws -> [String] {
return try self.matching(expression: NSRegularExpression(pattern: regexPattern))
}
}