Захватить определенные слова из строки

У меня есть данные JSON, которые я пытаюсь получить только по словам, включая возраст. Затем я планирую захватить все возрасты старше 21 года. Я дошел до того, что разделил каждое слово в строке на отдельную строку, но я не вижу способа обойти каждый возраст.

let JSON = """
{"data":"key=IAfpK, age=58, key=WNVdi, age=4, key=jp9zt, age=47, key=0Sr4C, age=68, key=CGEqo, age=76"}
"""
struct DataObject: Decodable {
    let data: String
 
}


func grabAges() {
    let jsonData = JSON.data(using: .utf8)!
    let dataObject: DataObject = try! JSONDecoder().decode(DataObject.self, from: jsonData)
    
    var arr = dataObject.data.components(separatedBy: ",")
    
    //print(dataObject.data)
    
}

"Планирую потом хватать всех возрастов старше 21 года": Вы чего хотите? 58, 47, 68, 76 или соответствующие ключи «IAfpK», «jp9zt» и т. д.?

Larme 17.05.2022 19:15
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
1
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Регулярное выражение может сделать это очень хорошо, не нужно разбивать строку.

Шаблон "\bage=(\d+)" ищет строку age= (в начале слова), за которой следует одна или несколько цифр, и фиксирует числовую часть.

С помощью compactMap вы можете сопоставлять (и фильтровать) результаты поиска со значениями Int.

let json = """
{"data":"key=IAfpK, age=58, key=WNVdi, age=4, key=jp9zt, age=47, key=0Sr4C, age=68, key=CGEqo, age=76"}
"""
struct DataObject: Decodable {
    let data: String
}

func grabAges() {
    let jsonData = json.data(using: .utf8)!
    let dataObject = try! JSONDecoder().decode(DataObject.self, from: jsonData)
    
    let data = dataObject.data
    let regex = try! NSRegularExpression(pattern: #"\bage=(\d+)"#)
    let ages = regex.matches(in: data, range: NSRange(data.startIndex..., in: data))
        .compactMap { match -> Int? in
            guard let range = Range(match.range(at: 1), in: data),
            let age = Int(data[range]), age > 21 else { return nil }
            return age
        }
    print(ages)
}

grabAges()

Другие вопросы по теме