import Foundation
let pattern = #"([^\s=]+)=('?)("?)([^>"']*)\2\3"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
style="width: 462px;" src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAg4AAALoCAYAAAAQpn2mAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dv4AACAASURBVHic7L15fNTVufj/PjOTyWSyTfaEJBD2EJBNQFQEtFVRXMD7VQG1dfu2tLW92t77unaxam+t9nbTXze9tW61Vdqvgre9FXcqUHFBFiUEkX0PgSQkmf1zzu+Pzz6ZhBBwg3l4kZn5fM7yPM8553me85znnAMZyEAGMpCBDGQgAxnIQAYykIEMZCADGchABjKQgQxkIAMZyEAGMpCBDGQgAxnIQAYykIEMZCADGchABjKQgQxkIAMZyEAGMpCBDGQgAxnIQAYykIEMZCADGchABjKQgQxkIAMZyEAGMpCBDGQgAxnIQAYykIEMZCADGchABjKQgQxkIAMZyEAGMpCBDGQgAxnIQAqIiy66SDXM/SW7DyUQgEIBAiFAKTOZQn8p7N/OQhB6PgFCgUI43ull6mmwyhUolFWJMB=' data-filename="Screenshot from 2016-02-09 21:54:47.png"
<tr><td><A HREF="brackets.html" TARGET="_top">Capturing group</A></td>
<td><TT>(regex)</TT></td>
<td>Parentheses group the regex between them. They capture the text matched by the regex inside them into a numbered group that can be reused with a numbered backreference. They allow you to apply regex operators to the entire grouped regex.</td>
<td><TT CLASS=code><SPAN CLASS="regexnest1">(</SPAN><SPAN CLASS="regexplain">abc</SPAN><SPAN CLASS="regexnest1">)</SPAN><SPAN CLASS="regexspecial">{3}</SPAN></TT> matches <TT CLASS=match>abcabcabc</TT>. First group matches <TT CLASS=match>abc</TT>.</td>
<td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>ECMA<br>extended<br>egrep<br>awk</td><td class=yes>YES</td><td>no</td><td class=yes>YES</td><td>no</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td><td class=yes>YES</td></tr>
<tr><td><A HREF="brackets.html" TARGET="_top">Capturing group</A></td>
<td><TT>\(regex\)</TT></td>
<td>Escaped parentheses group the regex between them. They capture the text matched by the regex inside them into a numbered group that can be reused with a numbered backreference. They allow you to apply regex operators to the entire grouped regex.</td>
<td><TT CLASS=code><SPAN CLASS="regexnest1">\(</SPAN><SPAN CLASS="regexplain">abc</SPAN><SPAN CLASS="regexnest1">\)</SPAN><SPAN CLASS="regexplain">{3}</SPAN></TT> matches <TT CLASS=match>abcabcabc</TT>. First group matches <TT CLASS=match>abc</TT>.</td>
<td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td><td class=yes>basic<br>grep</td><td>no</td><td class=yes>YES</td><td>no</td><td class=yes>YES</td><td>no</td><td>no</td><td>no</td><td>no</td></tr>
<tr><td><A HREF="brackets.html" TARGET="_top">Non-capturing group</A></td>
"""#
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