import Foundation
let pattern = #"(?P<protocol>\w+)\s*request\s*from\s*(?P<source_address>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}):(?P<source_port>\d+)\s*to\s*(?P<destination_address>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}):(?P<destination_port>\d+).\s*Action:\s*(?P<action>\w+).\s*Rule\s*Collection:\s*(?P<rule_collection>[^\s.]+).\s*Rule:\s*(?P<rule>[^\s}]+)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
UDP request from 20.0.1.42:34315 to 8.8.8.8:53. Action: Allow. Rule Collection: wfx-us-east-prod-allow-internet. Rule: allow-internet
TCP request from 162.158.79.116:45646 to 52.191.237.198:443 was DNAT'ed to 20.0.1.28:443. Rule Collection: wfx-us-east-prod-nat-rules. Rule: collector-02}}
"""#
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