import Foundation
let pattern = #"^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+) \[(?<loglevel>\w)\] (?<message>.*)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = ######"""
2020-04-30 08:26:09.379 [I] DOPiX de.icongmbh.dope.gui.web.DopeWebGui 32.2.4 (22323279) debug J00000000003-aa67ca3ef26946349158ec2da0216758 (""): (:)
### GUI J00000000002-7a8d7048a4f94b78a8a5c24341d763df setStatus mit Status: (I:kernel#0)
2020-04-30 08:26:09.381 [I] DOPiX de.icongmbh.dope.gui.web.DopeWebGui 32.2.4 (22323279) debug J00000000003-aa67ca3ef26946349158ec2da0216758 (""): (:)
### GUI J00000000002-7a8d7048a4f94b78a8a5c24341d763df creating status gui object for stepper
2020-04-30 08:26:09.381 [I] DOPiX de.icongmbh.dope.gui.web.DopeWebGui 32.2.4 (22323279) debug J00000000003-aa67ca3ef26946349158ec2da0216758 (""): (:)
### GUI J00000000002-7a8d7048a4f94b78a8a5c24341d763df transfer object for status set created!
2020-04-30 08:26:09.381 [I] DOPiX de.icongmbh.dope.gui.web.queue.OutputQueue 32.2.4 (22323279) debug J00000000003-aa67ca3ef26946349158ec2da0216758 (""): (:)
### GUI J00000000002-7a8d7048a4f94b78a8a5c24341d763df +++++ adding request to queue:
##### Transfer Object Output
StatusID: 0(OK)
SourceID: 3(GUI/Poll result)
FunctionID/SubFunctionID: 10/-1
(SetStatus)
RequestAgainHint false
SessionID null
TypTransferObject class de.icongmbh.dope.gui.web.DOPEGuiStatus
ArrayTransferObjects null
##### Transfer Object Output Ends
2020-04-30 08:26:09.381 [I] DOPiX de.icongmbh.dope.gui.web.queue.OutputQueue 32.2.4 (22323279) debug J00000000003-aa67ca3ef26946349158ec2da0216758 (""): (:)
### GUI J00000000002-7a8d7048a4f94b78a8a5c24341d763df Added request to queue, request list size: 7 (0|3|201|-1 / 0|3|19|-1 / 0|3|7|0 / 0|3|5000|-1 / 0|3|19|-1 / 0|3|20|1 / 0|3|10|-1 / )
"""######
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