import Foundation
// WARNING: You included a flag that Swift doesn't support: u
// When this flag is set, it makes the pattern and subject strings to be treated as unicode.
// Swift already treats the pattern and subject strings as unicode by default, so including this flag is redundant.
let pattern = ##"[\t\u000b\u000c\ufeff\p{Space_Separator}\n\r\u2028\u2029]|\/\*(?:(?!\*\/)[^]*?)?\*\/|<!--(?:(?!-->)[^]*?)?-->|\/\/[^\n\r\u2028\u2029]*|#?(?:[$_\p{ID_Start}]|\\(?:u[0-9a-fA-F]{4}|u\{(?:(?:10|[0-9])[0-9a-fA-F]{4}|[0-9a-fA-F]{1,5})\}))(?:[$\p{ID_Continue}]|\\(?:u[0-9a-fA-F]{4}|u\{(?:(?:10|[0-9])[0-9a-fA-F]{4}|[0-9a-fA-F]{1,5})\}))*|(?:\?\.(?![0-9])|\{|\(|\)|\[|\]|;|,|~|:|\.\.\.|\.|<<=|<<|<=|<|>>>=|>>>|>>=|>>|>=|>|===|==|=>|=|!==|!=|!|\*\*=|\*\*|\*=|\*|%=|%|\+\+|\+=|\+|--|-=|-|&&=|&&|&=|&|\|\|=|\|\||\|=|\||\?\?=|\?\?|\?|\^=|\^)|(?:(?:0|[1-9](?:_?(?:[0-9](?:_[0-9])*)+)?|0[0-7]*[89][0-9]+)\.?(?:[0-9](?:_[0-9])*)*(?:[eE][+-]?(?:[0-9](?:_[0-9])*)+)?)|(?:\.(?:[0-9](?:_[0-9])*)+(?:[eE][+-]?(?:[0-9](?:_[0-9])*)+)?)|(?:(?:0|[1-9](?:_?(?:[0-9](?:_[0-9])*)+)?|0[0-7]*[89][0-9]+)?[eE][+-]?(?:[0-9](?:_[0-9])*)+)|(?:0|[1-9](?:_?(?:[0-9](?:_[0-9])*)+)?)n|(?:0[bB](?:[01](?:_[01])*)+|0[oO](?:[0-7](?:_[0-7])*)+|0[xX](?:[0-9a-fA-F](?:_[0-9a-fA-F])*)+)n?|0[0-7]+|(["'])(?:(?!\1)[^\\\n\r]|\\(?:['"\\bfnrtv]|[^'"\\bfnrtv0-9xu\n\r\u2028\u2029]|0(?![0-9])|0(?=[89])|[1-7](?![0-7])|[0-3][0-7]{1,2}|[4-7][0-7]|[89]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u\{(?:(?:10|[0-9])[0-9a-fA-F]{4}|[0-9a-fA-F]{1,5})\})|\\(?:\r\n|\n|\r|\u2028|\u2029))*\1|`(?:\$(?!\{)|\\(?:['"\\bfnrtv]|[^'"\\bfnrtv0-9xu\n\r\u2028\u2029]|0(?![0-9])|x[0-9a-fA-F]{2}|(?:u[0-9a-fA-F]{4}|u\{(?:(?:10|[0-9])[0-9a-fA-F]{4}|[0-9a-fA-F]{1,5})\}))|\\(?:0[0-9]|[1-9]|x(?![0-9a-fA-F])|x[0-9a-fA-F](?![0-9a-fA-F])|u(?![0-9a-fA-F{])|u[0-9a-fA-F]{1,3}(?![0-9a-fA-F])|u\{(?![0-9a-fA-F])|u\{(?:1[1-9a-fA-F][0-9a-fA-F]{4}|[2-9a-fA-F][0-9a-fA-F]{5}|[0-9a-fA-F]{7,})(?![0-9a-fA-F])|u\{(?:(?:10|[0-9])[0-9a-fA-F]{4}|[0-9a-fA-F]{1,5})(?![0-9a-fA-F}]))|\\(?:\r\n|\n|\r|\u2028|\u2029)|\r\n|[^`\\$])*(?:`|\$\{)|#![^\n\r\u2028\u2029]*|\/(?:[^\n\r\u2028\u2029*\\/[]|\\[^\n\r\u2028\u2029]|\[(?:[^\n\r\u2028\u2029\]\\]|\\[^\n\r\u2028\u2029])*\])(?:[^\n\r\u2028\u2029\\/[]|\\[^\n\r\u2028\u2029]|\[(?:[^\n\r\u2028\u2029\]\\]|\\[^\n\r\u2028\u2029])*\])*\/[$\p{ID_Continue}]*"##
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
const a = 5;
const b = `${a} ${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