import Foundation
let pattern = #"^:(?![^:]*([^:])[^:]*\1)[dgimsuy]{0,7}:$"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
::
:g:
:d:
:i:
:m:
:s:
:u:
:y:
:dg:
:gi:
:ms:
:uy:
:sd:
:mu:
:yi:
:dgi:
:gms:
:iuy:
:sdm:
:ymu:
:dgim:
:gims:
:iysu:
:msuy:
:dgims:
:gimsu:
:iysum:
:mugsy:
:dsygiu:
:gsiumd:
:ydsugi:
:isgumy:
:mugydi:
:ysgmdi:
:sgydmi:
:yigdsm:
:mudysg:
:gsdiuy:
:digmsuy:
:sudgimy:
:ydugsim:
:mudyisg:
:sgimydu:
:ysgidum:
:muidsyg:
:gusdymi:
:yidgums:
:sugmidy:
:gg:
:dd:
:ii:
:mm:
:ss:
:uu:
:yy:
:dgg:
:idd:
:iig:
:mmm:
:sms:
:uuu:
:yyy:
:dggi:
:iddd:
:iigm:
:mmmm:
:smss:
:uuuu:
:yyyy:
:dggiu:
:idddm:
:iigmy:
:mmmms:
:smsss:
:uuuuy:
:yyyym:
:dgimsguy:
:ydsgimuy:
:dgimsuyy:
"""#
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