import Foundation
let pattern = #"({((\\?\".*?\\?\")*?)})"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"{\"active_ad_id\":\"789915\",\"publisher_id\":\"728\",\"publisher_data1\":\"225_192_99_bf56c9012a1d810f2ab52\",\"placement_id\":\"212_WDfTkctyUHoYbXDU\",\"device_os\":\"android\",\"device_os_version\":\"5.1\",\"ip\":\"78.26.216.249\",\"request\":\"/tracking?offer_id=789915\\u0026publisher_id=728\\u0026placement_id=212_WDfTkctyUHoYbXDU\\u0026publisher_data1=225_192_99_bf56c9012a1d810f2ab52\\u0026ios_ifa=\\u0026google_aid=\",\"agent\":\"Mozilla%2F5.0+%28Linux%3B+Android+5.1%3B+m2+Build%2FLMY47D%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F40.0.2214.124+Mobile+Safari%2F537.36\",\"host\":\"tracking.cph-media.com\",\"country\":\"ua\",\"state\":\"51\",\"city\":\"odesa\",\"network_id\":7,\"tracking_id\":\"007C1531432355PyAgF1NWwW9fMhSgNrn9TA\",\"source_id\":471,\"clicked_at\":\"2018-07-12 21:52:35.989354\",\"created_at\":\"2018-07-12 21:52:36.002024\",\"updated_at\":\"2018-07-12 21:52:36.002054\",\"unix_clicked_at\":1531432355,\"unix_clicked_at_date\":1531353600,\"unix_clicked_at_hour\":1531429200,\"unix_clicked_at_minute\":1531432320,\"ip_gdpr\":\"78.26.216.248\"}{\"active_ad_id\":\"1350798\",\"publisher_id\":\"804\",\"publisher_data1\":\"18071223_08_292289_a5d2f506c041e\",\"placement_id\":\"a292289s92520128_7086\",\"device_os\":\"android\",\"device_os_version\":\"6.0\",\"ip\":\"182.232.100.114\",\"request\":\"/tracking?offer_id=1350798\\u0026publisher_id=804\\u0026placement_id=a292289s92520128_7086\\u0026publisher_data1=18071223_08_292289_a5d2f506c041e\\u0026affe=fl\",\"agent\":\"Mozilla%2F5.0+%28Linux%3B+Android+6.0%3B+BLL-L22+Build%2FHUAWEIBLL-L22%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F66.0.3359.158+Mobile+Safari%2F537.36\",\"host\":\"tracking.stroeermp.com\",\"country\":\"th\",\"state\":\"10\",\"city\":\"bangkok\",\"network_id\":6,\"tracking_id\":\"006C1531432356dR4xiu2gcRDY4V7NfRVJhg\",\"source_id\":623,\"clicked_at\":\"2018-07-12 21:52:36.002165\",\"created_at\":\"2018-07-12 21:52:36.010711\",\"updated_at\":\"2018-07-12 21:52:36.014774\",\"unix_clicked_at\":1531432356,\"unix_clicked_at_date\":1531353600,\"unix_clicked_at_hour\":1531429200,\"unix_clicked_at_minute\":1531432320,\"ip_gdpr\":\"182.232.100.112\"}"#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression