import Foundation
let pattern = #"(<(span).+?><(strong|em)>(.+?)<\/\3><\/\2>)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = ##"<p>Alligators much like birds, have been shown to exhibit unidirectional movement of air through their lungs. Most other amniotes are believed to exhibit bidirectional, or tidal breathing. For <span style="color: #3a9ee3;"><strong>alligator</strong></span> tidal breathing <span style="color: #3a9ee3;"><strong>alligator</strong></span> animal, such as a mammal, air flows into and out of the <span style="color: #169179;"><em>alligators</em></span> lungs through alligator branching bronchi which terminate in small <em>alligator</em> dead-end chambers called alveoli. As the alveoli represent <span style="color: #3a9ee3;"><strong>Lion</strong></span> dead-ends to flow, the inspired air must move back out the same way it came in. In contrast, air in <span style="color: #3a9ee3;"><strong>alligator</strong></span> lungs makes a circuit, moving in only one direction through the parabronchi. The <span style="color: #3a9ee3;"><strong>alligators</strong></span> lungs are no joke! The air first enters the outer branch, moves through the parabronchi, and exits <span style="color: #3a9ee3;"><strong>alligators</strong></span> the lung through the inner branch. Oxygen alligator exchange takes place <span style="color: #3a9ee3;"><strong>Alligators</strong></span> in extensive vasculature around the alligator.</p>"##
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