import Foundation
let pattern = #"^(?<date>\d{4}-\d{2}-\d{2})\s*(?<time>\d{2}:\d{2}:\d{2}:\d{3})\s*\[\s*(?<level>\w*)\s*(?<module>.*?)\s*\]\s*(?<message>.*)$"#
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .caseInsensitive])
let testString = #"""
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database ] [ OCC::SyncJournalDb::tableColumns ]: Columns in the current journal: QVector("path", "chunk", "transferid", "errorcount", "size", "modtime", "contentChecksum")
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database.sql ] [ OCC::SqlQuery::exec ]: SQL exec "PRAGMA table_info('conflicts');"
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database ] [ OCC::SyncJournalDb::tableColumns ]: Columns in the current journal: QVector("path", "baseFileId", "baseEtag", "baseModtime", "basePath")
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database.sql ] [ OCC::SqlQuery::exec ]: SQL exec "CREATE INDEX IF NOT EXISTS metadata_e2e_id ON metadata(e2eMangledName);"
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database.sql ] [ OCC::SqlQuery::exec ]: Last exec affected 0 rows.
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database ] [ OCC::SyncJournalDb::commitInternal ]: Transaction commit "update database structure: add e2eMangledName index" and starting new transaction
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database.sql ] [ OCC::SqlQuery::exec ]: SQL exec "PRAGMA table_info('blacklist');"
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database ] [ OCC::SyncJournalDb::tableColumns ]: Columns in the current journal: QVector("path", "lastTryEtag", "lastTryModtime", "retrycount", "errorstring", "lastTryTime", "ignoreDuration", "renameTarget", "errorCategory", "requestId")
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database.sql ] [ OCC::SqlQuery::exec ]: SQL exec "CREATE INDEX IF NOT EXISTS blacklist_index ON blacklist(path collate nocase);"
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database.sql ] [ OCC::SqlQuery::exec ]: Last exec affected 0 rows.
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database ] [ OCC::SyncJournalDb::commitInternal ]: Transaction commit "checkConnect End"
2021-09-27 09:28:25:778 [ debug nextcloud.sync.database.sql ] [ OCC::SqlQuery::exec ]: SQL exec "SELECT COUNT(*) FROM metadata"
2021-09-27 09:28:25:794 [ info nextcloud.gui.folder.manager ]: Adding folder to Folder Map OCC::Folder(0x2677fdf3ee0) "1"
2021-09-27 09:28:25:795 [ info nextcloud.gui.folder.manager ]: Schedule folder "1" to sync!
2021-09-27 09:28:25:795 [ info nextcloud.gui.folder.manager ]: Folder is not ready to sync, not scheduled!
2021-09-27 09:28:25:797 [ info nextcloud.gui.application ]: Sync state changed for folder "" : "Not yet Started"
2021-09-27 09:28:25:797 [ info nextcloud.sync.clientproxy ]: Set proxy configuration to use the preferred system proxy for http tcp connections
2021-09-27 09:28:25:801 [ debug nextcloud.gui.updater ] [ OCC::Updater::create ]: QUrl("https://updates.nextcloud.org/client/?version=3.3.4.20210920&platform=win32&osRelease=windows&osVersion=server2016&kernelVersion=10.0.17763&oem=Nextcloud&buildArch=x86_64¤tArch=x86_64&versionsuffix=stable-Win64&updatesegment=43&msi=true")
2021-09-27 09:28:26:533 [ info nextcloud.sync.credentials.webflow ]: Fetch from keychain!
2021-09-27 09:28:26:536 [ info nextcloud.gui.folder.navigationpane ]: Explorer Cloud storage provider: saving path "" to CLSID "{5cefc208-e391-444c-af93-61c636da9853}"
2021-09-27 09:28:26:537 [ info nextcloud.gui.socketapi ]: New connection QLocalSocket(0x267027e4570)
2021-09-27 09:28:26:538 [ warning nextcloud.sync.credentials.keychainchunk ]: Unable to read "Nextcloud_clientCertificatePEM:0" chunk "0" "Password entry not found"
2021-09-27 09:28:26:538 [ warning nextcloud.sync.credentials.keychainchunk ]: Unable to read "Nextcloud_clientKeyPEM" chunk "0" "Password entry not found"
2021-09-27 09:28:26:538 [ warning nextcloud.sync.credentials.webflow ]: Unable to read client key "Password entry not found"
2021-09-27 09:28:26:538 [ warning nextcloud.sync.credentials.keychainchunk ]: Unable to read "Nextcloud_su_mssrv01_clientCaCertificatePEM0" chunk "0" "Password entry not found"
2021-09-27 09:28:26:538 [ warning nextcloud.sync.credentials.webflow ]: Unable to read client CA cert slot "0" "Password entry not found"
2021-09-27 09:28:26:538 [ debug nextcloud.sync.account ] [ OCC::Account::slotCredentialsFetched ]: User id already fetched.
2021-09-27 09:28:26:539 [ info nextcloud.gui.account.state ]: Fetched credentials for "" attempting to connect
2021-09-27 09:28:26:539 [ debug nextcloud.sync.account ] [ OCC::Account::resetNetworkAccessManager ]: Resetting QNAM
2021-09-27 09:28:26:539 [ info nextcloud.sync.credentials.webflow ]: Get QNAM
2021-09-27 09:28:26:539 [ debug nextcloud.sync.connectionvalidator ] [ OCC::ConnectionValidator::checkServerAndAuth ]: Checking server and authentication
2021-09-27 09:28:26:539 [ debug nextcloud.sync.connectionvalidator ] [ OCC::ConnectionValidator::checkServerAndAuth ]: Trying to look up system proxy
2021-09-27 09:28:26:540 [ info nextcloud.sync.connectionvalidator ]: No system proxy set by OS
2021-09-27 09:28:26:541 [ info nextcloud.sync.accessmanager ]: 2 "" "" has X-Request-ID "75765e8e-2b52-4dd9-b67b-62b450feafdc"
2021-09-27 09:28:26:541 [ debug nextcloud.sync.cookiejar ] [ OCC::CookieJar::cookiesForUrl ]: QUrl("") requests: (QNetworkCookie("nc_sameSiteCookielax=true; secure; HttpOnly; expires=Fri, 31-Dec-2100 23:59:59 GMT), QNetworkCookie("nc_sameSiteCookiestrict=true; secure; HttpOnly; expires=Fri, 31-Dec-2100 23:59:59 GMT))
2021-09-27 09:28:26:541 [ info nextcloud.sync.networkjob ]: OCC::CheckServerJob created for "" + "status.php" "OCC::ConnectionValidator"
2021-09-27 09:28:26:795 [ debug nextcloud.gui.folderwatcher ] [ OCC::FolderWatcher::pathIsIgnored ]: * Ignoring file "D:/Shared/NextcloudMirror/.owncloudsync.log"
2021-09-27 09:28:28:826 [ info nextcloud.gui.updater ]: Checking for available update
2021-09-27 09:28:28:826 [ info nextcloud.sync.accessmanager ]: 2 "" "https://updates.nextcloud.org/client/?version=3.3.4.20210920&platform=win32&osRelease=windows&osVersion=server2016&kernelVersion=10.0.17763&oem=Nextcloud&buildArch=x86_64¤tArch=x86_64&versionsuffix=stable-Win64&updatesegment=43&msi=true" has X-Request-ID "2fbd3d8d-a4e6-486f-b0f7-dbd441225cd3"
2021-09-27 09:28:28:826 [ debug nextcloud.sync.cookiejar ] [ OCC::CookieJar::cookiesForUrl ]: QUrl("https://updates.nextcloud.org/client/?version=3.3.4.20210920&platform=win32&osRelease=windows&osVersion=server2016&kernelVersion=10.0.17763&oem=Nextcloud&buildArch=x86_64¤tArch=x86_64&versionsuffix=stable-Win64&updatesegment=43&msi=true") requests: ()
2021-09-27 09:28:29:638 [ info nextcloud.sync.credentials.webflow ]: request finished
"""#
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