import Foundation
let pattern = #"\s+R\*$"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
-------------
---UPLOADS---
-------------
SESSION|01/09/2017 15:35:42.143|[SFTP:1060257_0:it:10.87.16.71] WROTE: *150 Opening BINARY mode data connection. Ready to write file /it/cpp. "/it/cpp") S T O R*
SESSION|01/09/2017 15:35:42.890|[SFTP:1060257_0:it:10.87.16.71] READ: *STOR END /it/cpp:PENs3*
SESSION|01/09/2017 15:35:43.133|226-Upload File Size:1571846 bytes @ 1535K/sec. MD5=8438660f668ceb3de586cd7ef1263bc4
---
SESSION|01/09/2017 15:35:42.143|[SFTP:1060257_0:it:10.87.16.71] WROTE: *150 Opening BINARY mode data connection. Ready to write file /it/cpp. "/it/cpp") S T O R*
SESSION|01/09/2017 15:35:43.133|226-Upload File Size:1571846 bytes @ 1535K/sec. MD5=8438660f668ceb3de586cd7ef1263bc4
SESSION|01/09/2017 15:35:42.890|[SFTP:1060257_0:it:10.87.16.71] READ: *STOR END /it/cpp:PENs3*
---
SESSION|12/20/2016 15:12:26.273|[SFTP:1008699_0:it:10.87.16.71] WROTE: *150 Opening BINARY mode data connection. Ready to write file /it/cpp. "/it/cpp") S T O R*
SESSION|12/20/2016 15:12:26.299|226-Upload File Size:25 bytes @ 0K/sec. MD5=7e5e5560ab14904d5f5b2af5fcd8bec3
SESSION|12/20/2016 15:12:26.299|[SFTP:1008699_0:it:10.87.16.71] WROTE: *226 Transfer complete. MD5=7e5e5560ab14904d5f5b2af5fcd8bec3 ("/it/cpp" 25) STOR*
---------------
---DOWNLOADS---
---------------
SESSION|01/17/2017 18:19:25.566|[SFTP:1073958_0:ss.irth.test:10.87.16.71] WROTE: *150 Opening BINARY mode data connection for /test/cpp (25 bytes). ("/test/cpp") R E T R*
SESSION|01/17/2017 18:19:25.767|226-Download File Size:25 bytes @ 0K/sec.
SESSION|01/17/2017 18:19:25.768|[SFTP:1073958_0:ss.irth.test:10.87.16.71] WROTE: *226 Transfer complete. MD5=7e5e5560ab14904d5f5b2af5fcd8bec3 ("/test/cpp") RETR*
---
SESSION|01/17/2017 18:19:26.147|[SFTP:1073958_0:ss.irth.test:10.87.16.71] WROTE: *150 Opening BINARY mode data connection for /test/cpp (25 bytes). ("/test/cpp") R E T R*
SESSION|01/17/2017 18:19:26.173|226-Download File Size:25 bytes @ 0K/sec.
SESSION|01/17/2017 18:19:26.174|[SFTP:1073958_0:ss.irth.test:10.87.16.71] WROTE: *226 Transfer complete. MD5=7e5e5560ab14904d5f5b2af5fcd8bec3 ("/test/cpp") RETR*
---
SESSION|01/17/2017 18:19:26.614|[SFTP:1073958_0:ss.irth.test:10.87.16.71] WROTE: *150 Opening BINARY mode data connection for /test/cpp (25 bytes). ("/test/cpp") R E T R*
SESSION|01/17/2017 18:19:26.736|226-Download File Size:25 bytes @ 0K/sec.
SESSION|01/17/2017 18:19:26.737|[SFTP:1073958_0:ss.irth.test:10.87.16.71] WROTE: *226 Transfer complete. MD5=7e5e5560ab14904d5f5b2af5fcd8bec3 ("/test/cpp") RETR*a
"""#
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