import Foundation
let pattern = #"^(?<type>(?:ci-|cloud-)?[^-]+)[_-](?<version>\d+\.\d+\.\d+)(?<alpha>[-+]alpha)?(?:-(?<date>\d{8}))?[-+](?:(?<build>\d+).(?<builddate>\d{8}))?(?:[.-]?(?<sha>[A-Fa-f0-9]+(?:[.-]\d+)?))?(?:\.(?<arch>.+))?\.(?<fmt>.{3})"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
cloud-csm-6.4.13-20210927-89fa91ca.lnx.x86_64.zip
cams-7.2.4+4.20211216.zip
cams-7.2.4-alpha+4.20211216.zip
cca-6.4.23+753.20211216.193a0386-1.noarch.rpm
cca-6.4.23+alpha+753.20211216.193a0386-1.noarch.rpm
cca-6.4.23-alpha+753.20211216.193a0386.zip
cca_6.4.23+753.20211216.193a0386-1_all.deb
ci-j2ee-6.4.23+790.20211216.193a0386.zip
ci-j2ee-6.4.23-alpha+790.20211216.193a0386.zip
ci-server-6.4.23+790.20211216.193a0386.zip
ci-server-6.4.23-alpha+790.20211216.193a0386.zip
cloud-ci-7.1.15+90.20210119.46eef7d3-1.noarch.rpm
cloud-ci-7.2.4+247.20211216.eba3915b.noarch.zip
cloud-ci-7.2.4+alpha+247.20211216.eba3915b-1.noarch.RPM
cloud-ci-7.2.4-alpha+247.20211216.eba3915b.noarch.zip
cloud-cm-7.2.4+246.20211216.eba3915b-1.noarch.rpm
cloud-cm-7.2.4+246.20211216.eba3915b.noarch.zip
cloud-cm-7.2.4+alpha+246.20211216.eba3915b-1.noarch.rpm
cloud-cm-7.2.4-alpha+246.20211216.eba3915b.noarch.zip
cloud-csd-7.2.4+241.20211216.eba3915b-1.x86_64.rpm
cloud-csd-7.2.4+241.20211216.eba3915b.1-sym-x86_64.rpm
cloud-csd-7.2.4+241.20211216.eba3915b.lnx.x86_64.zip
cloud-csd-7.2.4+241.20211216.eba3915b.sym.lnx.x86_64.zip
cloud-csd-7.2.4+alpha+241.20211216.eba3915b-1.x86_64.rpm
cloud-csd-7.2.4+alpha+241.20211216.eba3915b.1-sym-x86_64.rpm
cloud-csd-7.2.4-alpha+241.20211216.eba3915b.lnx.x86_64.zip
cloud-csd-7.2.4-alpha+241.20211216.eba3915b.sym.lnx.x86_64.zip
cloud-csm-6.4.13-20210927-89fa91ca.lnx.x86_64.zip
cloud-csm-6.4.13-20210927-89fa91ca.win.x86.zip
cloud-cst-7.2.4+241.20211216.eba3915b-1.x86_64.rpm
cloud-cst-7.2.4+241.20211216.eba3915b.1-sym-x86_64.rpm
cloud-cst-7.2.4+241.20211216.eba3915b.lnx.x86_64.zip
cloud-cst-7.2.4+241.20211216.eba3915b.sym.lnx.x86_64.zip
cloud-cst-7.2.4+alpha+241.20211216.eba3915b-1.x86_64.rpm
cloud-cst-7.2.4+alpha+241.20211216.eba3915b.1-sym-x86_64.rpm
cloud-cst-7.2.4-alpha+241.20211216.eba3915b.lnx.x86_64.zip
cloud-cst-7.2.4-alpha+241.20211216.eba3915b.sym.lnx.x86_64.zip
cloud-parts-7.2.4-20211216.zip
cloud-parts-7.2.4-alpha-20211216.zip
cloud-xds-6.4.6-20211101-4b76a168.lnx.x86.zip
cloud-xds-6.4.6-20211101-4b76a168.win.x86.zip
cm-6.4.23+798.20211216.193a0386-1.noarch.rpm
cm-6.4.23+alpha+798.20211216.193a0386-1.noarch.rpm
cm-6.4.23-alpha+798.20211216.193a0386.zip
cm_6.4.23+798.20211216.193a0386-1_all.deb
cm_6.4.23+alpha+798.20211216.193a0386-1_all.deb
csm-6.4.13-20210927-89fa91ca.lnx.x86_64.tar
csm-6.4.13-20210927-89fa91ca.win.x86.zip
dbconfig-7.2.4+231.20211216.eba3915b.zip
dbconfig-7.2.4-alpha+231.20211216.eba3915b.zip
xds-6.4.6-20211101-4b76a168.lnx.x86.tar
xds-6.4.6-20211101-4b76a168.win.x86.zip
"""#
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