import Foundation
let pattern = #"[\s\S]{25}(?<log_level>\w+ \d).---.\[Thread-(?<thread_id>\d+)][\s\S]{42}(?(?=: debug1): (?<internal_log_level>\w+)): (?(?=(?:.*?): )(?<module>.*?): )(?<message>.*)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
2020-03-24 07:23:26.506 INFO 6 --- [Thread-3853] S.s.ssh-output : Allocated port 40239 for remote forward to localhost:8192
2020-03-24 07:23:26.458 INFO 6 --- [Thread-3853] S.s.ssh-output : Authenticated to tunnel.alero.io ([3.225.55.134]:443).
2020-03-24 07:23:25.972 INFO 6 --- [Thread-3853] S.s.ssh-output : OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017
2020-03-24 07:22:55.949 INFO 6 --- [Thread-3851] S.s.ssh-output : ssh_exchange_identification: Connection closed by remote host
2020-03-26 14:50:11.591 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 1: connected to localhost port 8192
2020-03-26 14:50:11.591 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: confirm forwarded-tcpip
2020-03-26 14:50:11.591 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 1: new [192.168.33.160]
2020-03-26 14:50:11.591 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: connect_next: host localhost ([127.0.0.1]:8192) in progress, fd=5
2020-03-26 14:50:11.589 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: client_request_forwarded_tcpip: listen 0.0.0.0 port 40239, originator 192.168.33.160 port 37440
2020-03-26 14:50:11.589 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: client_input_channel_open: ctype forwarded-tcpip rchan 2 win 2097152 max 32768
2020-03-26 14:50:11.372 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 0: connected to localhost port 8192
2020-03-26 14:50:11.372 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: confirm forwarded-tcpip
2020-03-26 14:50:11.372 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 0: new [192.168.62.96]
2020-03-26 14:50:11.372 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: connect_next: host localhost ([127.0.0.1]:8192) in progress, fd=4
2020-03-26 14:50:11.372 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: client_request_forwarded_tcpip: listen 0.0.0.0 port 40239, originator 192.168.62.96 port 59736
2020-03-26 14:50:11.372 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: client_input_channel_open: ctype forwarded-tcpip rchan 1 win 2097152 max 32768
2020-03-26 14:50:10.872 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 0: free: 192.168.62.96, nchannels 2
2020-03-26 14:49:11.329 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 0: connected to localhost port 8192
2020-03-26 14:49:11.329 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: confirm forwarded-tcpip
2020-03-26 14:49:11.329 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 0: new [192.168.62.96]
2020-03-26 14:49:11.329 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: connect_next: host localhost ([127.0.0.1]:8192) in progress, fd=4
2020-03-26 14:49:11.328 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: client_request_forwarded_tcpip: listen 0.0.0.0 port 40239, originator 192.168.62.96 port 58296
2020-03-26 14:49:11.328 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: client_input_channel_open: ctype forwarded-tcpip rchan 1 win 2097152 max 32768
2020-03-26 14:49:10.875 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 0: free: 192.168.33.160, nchannels 2
2020-03-26 14:49:03.819 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 1: free: 192.168.33.160, nchannels 3
2020-03-26 14:48:49.820 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 8: free: 192.168.62.96, nchannels 4
2020-03-26 14:48:49.820 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 7: free: 192.168.62.96, nchannels 5
2020-03-26 14:48:49.820 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 5: free: 192.168.33.160, nchannels 6
2020-03-26 14:48:49.819 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 3: free: 192.168.33.160, nchannels 7
2020-03-26 14:48:49.819 INFO 6 --- [Thread-3853] S.s.ssh-output : debug1: channel 2: free: 192.168.33.160, nchannels 8
"""#
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