import Foundation
let pattern = #"(<)(.*?[^>]+)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = ##"<table class=\"mce-item-table\" style=\"border-collapse: collapse; width: 676px; word-break: break-all; outline: none; height: 5px; border-bottom: 1px solid rgb(27, 105, 178); text-align: left;\" contenteditable=\"false\"><caption style=\"display: none; \" data-mce-style=\"display: none; outline: grey solid 2px;\"></caption><tbody><tr><th style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: rgb(27, 105, 178);\" data-mce-style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: #1b69b2;\"><span style=\"color: rgb(255, 255, 255);\" data-mce-style=\"color: #ffffff;\"><strong>Application</strong></span></th><th style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: rgb(27, 105, 178);\" data-mce-style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: #1b69b2;\"><span style=\"color: rgb(255, 255, 255);\" data-mce-style=\"color: #ffffff;\"><strong>Platform</strong></span></th><th style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: rgb(27, 105, 178);\" data-mce-style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: #1b69b2;\"><span style=\"color: rgb(255, 255, 255);\" data-mce-style=\"color: #ffffff;\"><strong>URL</strong></span></th><th style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: rgb(27, 105, 178);\" data-mce-style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: #1b69b2;\"><span style=\"color: rgb(255, 255, 255);\" data-mce-style=\"color: #ffffff;\"><strong>Cost</strong></span></th></tr><tr><td style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: #fffde9;\">FileZilla</td><td style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: #fffde9;\">Windows, Mac, Linux</td><td style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: #fffde9;\"><a>https:/<wbr>/<wbr>filezilla-project.org</a></td><td style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: #fffde9;\">Free download</td></tr><tr><td style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: #fffcd6;\">SmartFTP</td><td style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: #fffcd6;\">Windows</td><td style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: #fffcd6;\"><a>https:/<wbr>/<wbr>www.smartftp.com</a></td><td style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: #fffcd6;\">Free download</td></tr><tr><td style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: #fffde9;\">CuteFTP</td><td style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: #fffde9;\">Windows, Mac</td><td style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: #fffde9;\"><a>https:/<wbr>/<wbr>www.cuteftp.com</a></td><td style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: rgb(255, 253, 233);\" data-mce-style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: #fffde9;\">Free trial download, academic pricing available</td></tr><tr><td style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 95px; text-align: left; vertical-align: top; background-color: #fffcd6;\">WS_FTP</td><td style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 173px; text-align: left; vertical-align: top; background-color: #fffcd6;\">Windows</td><td style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 212px; text-align: left; vertical-align: top; background-color: #fffcd6;\"><a>https:/<wbr>/<wbr>www.ipswitch.com</a></td><td style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: rgb(255, 252, 214);\" data-mce-style=\"outline: none; width: 194px; text-align: left; vertical-align: top; background-color: #fffcd6;\">Free trial download</td></tr></tbody></table>"##
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