import Foundation
let pattern = #"^(?<epoch>\d:)?(?<upstreamVersion>[^-+~\n ]+)(?<debianRevision>[-+~\d].*)?$"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
0.6.45-1ubuntu1
2.2.52-3build1
1:2.0.28-1ubuntu1
3.116ubuntu1
3.20180524.1~ubuntu0.18.04.2
2.12-4ubuntu5.1
2.20.9-0ubuntu7.7
0.20
1.6.11
1.6.11
1.6.11
3.1.20-3.1ubuntu2
1:4.9+20170918-1ubuntu1
10.1ubuntu2.4
3.5.44
4.4.18-2ubuntu1.2
1:2.8-1ubuntu1
1.07.1-2
1.0.8-2build1
1:9.11.3+dfsg-1ubuntu1.8
11.1.2ubuntu1
1:2.31.1-0.4ubuntu3.3
4.15.1-1build1
4.15.1-1build1
1:1.27.2-2ubuntu3.2
1:1.27.2-2ubuntu3.2
5.125-0ubuntu1
1.0.6-8.1ubuntu0.2
20180409
1.4
0.30-0ubuntu5
0.40ubuntu1.1
0.40ubuntu1.1
18.04.5
18.04.5
1.178ubuntu2.9
1.178ubuntu2.9
1.2.6-3
8.28-1ubuntu1
2.12+dfsg-6
3.18-1build1
3.0pl1-128.1ubuntu1
2:2.0.2-1ubuntu1.1
2:2.0.2-1ubuntu1.1
7.58.0-2ubuntu3.7
0.5.8-2.10
1.12.2-1ubuntu1.1
1.5.66ubuntu1
1.5.66ubuntu1
4.8.4
1:3.6-1
2.2.4-1ubuntu1.2
0.37ubuntu0.5
2:1.02.145-4.1ubuntu3.18.04.1
3.1-1
2:1.02.145-4.1ubuntu3.18.04.1
2018013001
2.79-1
1:9.11.3+dfsg-1ubuntu1.8
5:18.09.7~3-0~ubuntu-bionic
5:18.09.7~3-0~ubuntu-bionic
4.1-1
1.19.0.5ubuntu2.1
1.44.1-1ubuntu1.1
2.0.10.4-3.5ubuntu2.18.04.3
1.10-2.1
2.1.5+deb1+cvs20081104-13.2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:20.2.2+dfsg-1ubuntu2
1:4.15-0ubuntu1
2.31.1-0.4ubuntu3.3
1:5.32-2ubuntu0.2
4.6.0+git+20170828-2
2.12.6-0ubuntu2
2.37-1
0.83-2
0.2.38ubuntu1.1
0.17-34
2.9.7-1ubuntu1
1:4.1.4+dfsg-1build1
8.3.0-6ubuntu1~18.04.1
20180315-1
0.19.8.1-6ubuntu0.3
1.56.1-1
1:2.17.1-1ubuntu0.4
1:2.17.1-1ubuntu0.4
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
2.2.4-1ubuntu1.2
3.1-2
1.22.3-10
2.02-2ubuntu8.13
0.7
1:1
2.02-2ubuntu8.13
2.02-2ubuntu8.13
2.02-2ubuntu8.13
1.6-5ubuntu1
9.54+ds-1
3.20
2.1.0-3
1.7.7-1
6.5.0.dfsg.1-2
1.51
1.51
0.130ubuntu3.8
0.130ubuntu3.8
0.130ubuntu3.8
6.5.0.dfsg.1-2
2.62ubuntu1
3.20190618.0ubuntu0.18.04.1
4.15.0-2ubuntu1
1.6.1-2ubuntu2
3:20161105-1ubuntu2
3:20161105-1ubuntu2
1.3.0-0.1ubuntu0.18.04.1
4.3.5-3ubuntu7.1
4.3.5-3ubuntu7.1
3.79-1
2.3.1-1
4.14-0.1
2.0.4-2ubuntu1
1.178ubuntu2.9
1.5.9-9.2ubuntu2
2.0.4-9ubuntu2
24-1ubuntu3.2
1.16-2ubuntu0.1
18.01-0ubuntu3.3
1:18.04+20180712
1:18.04+20180712
0.188.3
0.16
487-0.1
0.6.45-1ubuntu1
2.2.52-3build1
2.12-4ubuntu5.1
1.6.11
1.6.11
0~20161029-1.1
7.5.0+dfsg-1
2.5.1-2
1:2.5.1-2build1
1:2.4.47-2build1
1:2.8.2-1ubuntu1
1:2.8.2-1ubuntu1
1:9.11.3+dfsg-1ubuntu1.8
2.31.1-0.4ubuntu3.3
1.65.1+dfsg-0ubuntu5
1.65.1+dfsg-0ubuntu5
1.65.1+dfsg-0ubuntu5
1.65.1+dfsg-0ubuntu5
0.8.7-1
1.0.6-8.1ubuntu0.2
2.27-3ubuntu1
2.27-3ubuntu1
0.7.7-3.1
1:2.25-1.2
1:2.25-1.2
1.44.1-1ubuntu1.1
2:2.0.2-1ubuntu1.1
7.58.0-2ubuntu3.7
7.58.0-2ubuntu3.7
5.3.28-13.1ubuntu1.1
1.12.2-1ubuntu1.1
0.213ubuntu1
2:1.02.145-4.1ubuntu3.18.04.1
2:1.02.145-4.1ubuntu3.18.04.1
1:9.11.3+dfsg-1ubuntu1.8
1:9.11.3+dfsg-1ubuntu1.8
2.4.97-1ubuntu1~18.04.1
2.4.97-1ubuntu1~18.04.1
1.12-7build1
3.1-20170329-1
0.170-0.4ubuntu0.1
0.17025-1
0.1.10-2.1
2.1.8-stable-4build1
2.2.5-3ubuntu0.1
1.44.1-1ubuntu1.1
0.99.8-2
2.31.1-0.4ubuntu3.3
3.2.1-8
2.12.6-0ubuntu2
2.8.1-2ubuntu2
0.19.7-2
2.9.7-1ubuntu1
1:8.3.0-6ubuntu1~18.04.1
1.8.1-4ubuntu1.1
2.2.5-4ubuntu0.3
1.14.1-6
1.14.1-6
1.6.12-1
1.56.1-1
2.56.4-0ubuntu0.18.04.4
2.56.4-0ubuntu0.18.04.4
2:6.1.2+dfsg-2
3.5.18-1ubuntu1.1
2.5-2.2ubuntu3
1.27-6
1.20.7-5
1.16-2ubuntu0.1
7.5.0+dfsg-1
7.5.0+dfsg-1
7.5.0+dfsg-1
7.5.0+dfsg-1
0.13.3-2.2
3.4-1
7.5.0+dfsg-1
60.2-3ubuntu3
1.33-2.1ubuntu1.2
2.0.4-1.1build2
1.6.1-2ubuntu2
1.6.1-2ubuntu2
1.6.1-2ubuntu2
1:9.11.3+dfsg-1ubuntu1.8
1:9.11.3+dfsg-1ubuntu1.8
1:9.11.3+dfsg-1ubuntu1.8
1:9.11.3+dfsg-1ubuntu1.8
1:9.11.3+dfsg-1ubuntu1.8
0.97-2build1
2.1-3.1build1
3.6.0-11
1.5.2-0ubuntu5.18.04.1
8c-2ubuntu8
0.12.1-1.3
1.16-2ubuntu0.1
1.5.9-9.2ubuntu2
2.0.4-9ubuntu2
24-1ubuntu3.2
7.5.0+dfsg-1
1.16-2ubuntu0.1
1.16-2ubuntu0.1
1.3.5-2
2.4.45+dfsg-1ubuntu1.2
2.4.45+dfsg-1ubuntu1.2
1.07-3build2
2.4.6-2
2.1.0~beta3+dfsg-5.1
2.1.0~beta3+dfsg-5.1
2.02.176-4.1ubuntu3.18.04.1
2.02.176-4.1ubuntu3.18.04.1
1:9.11.3+dfsg-1ubuntu1.8
3.0.3-0ubuntu1~18.04.1
3.0.3-0ubuntu1~18.04.1
0.0~r131-2ubuntu3
5.2.2-1.3
2.08-1.2
1:5.32-2ubuntu0.2
1:5.32-2ubuntu0.2
1.0.4-2
2.31.1-0.4ubuntu3.3
2.4.2-1ubuntu1
4.0.1-1
0.6-3ubuntu0.2
6.1-1ubuntu1.18.04
6.1-1ubuntu1.18.04
1.0.6-2
3.4-1
0.52.20-1ubuntu1
1.0.1-3
0.25-5.1
1.30.0-1ubuntu1
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
1.0.3-6ubuntu2
3.2.29-0ubuntu3
3.2.29-0ubuntu3
1.5-3
237-3ubuntu10.24
1:2017.3.23-2ubuntu0.18.04.2
2.0.11-2.1ubuntu0.1
2.3.4-1.1ubuntu3
0.23.9-2
1:2.25-1.2
1.1.8-3.6ubuntu2.18.04.1
1.1.8-3.6ubuntu2.18.04.1
1.1.8-3.6ubuntu2.18.04.1
237-3ubuntu10.24
1.1.8-3.6ubuntu2.18.04.1
3.2-20ubuntu0.2
1.8.1-6ubuntu1
1:3.5.2-1ubuntu1.1
2:8.39-9
2:8.39-9
5.26.1-6ubuntu0.3
1.5.0-1
0.9.3-1ubuntu7.18.04.2
1.6.34-1ubuntu0.18.04.2
0.105-20ubuntu0.18.04.5
0.105-20ubuntu0.18.04.5
0.105-20ubuntu0.18.04.5
1.16-11
10.9-0ubuntu0.18.04.1
2:3.3.12-3ubuntu1.1
0.19.1-5build1
2.7.15~rc1-1
2.7.15-4ubuntu4~18.04
2.7.15-4ubuntu4~18.04
3.6.7-1~18.04
3.6.8-1~18.04.1
3.6.8-1~18.04.1
3.6.8-1~18.04.1
5.2+dfsg-3build1
7.0-3
7.5.0+dfsg-1
2.4+20151223.gitfa8646d.1-1
2.1.27~101-g0780600+dfsg-3ubuntu2
2.1.27~101-g0780600+dfsg-3ubuntu2
2.1.27~101-g0780600+dfsg-3ubuntu2
1.0.17+dfsg-2
2.4.1-0ubuntu0.18.04.2
2.7-2build2
2.7-2build2
2.7-2build2
1:3.4.0-4
2.7-1
2.12-1
2.3.1a-3ubuntu1
2.31.1-0.4ubuntu3.3
1.1.7-1
3.22.0-1ubuntu0.1
1.44.1-1ubuntu1.1
1.0.2n-1ubuntu5.3
1.1.1-1ubuntu2.1~18.04.4
8.3.0-6ubuntu1~18.04.1
0+svn585-1build1
237-3ubuntu10.24
4.13-2
2.5-2.2ubuntu3
0.04-7.1
1.7-5build6
0.06-7.1
4.0.9-5ubuntu0.2
6.1-1ubuntu1.18.04
0.2.5-1.2ubuntu0.1
237-3ubuntu10.24
0.9.9-0ubuntu2
1.2.1-8
2:1.0.21-2
1.1.6-3
2.31.1-0.4ubuntu3.3
1.18.0-3
0.6.1-2
7.5.0+dfsg-1
7.6.q-27
2:1.6.4-3ubuntu0.2
2:1.6.4-3ubuntu0.2
1:1.0.8-1
1.13-2~ubuntu18.04
1:1.1.2-3
2:1.3.3-1
2.9.4+dfsg1-6.1ubuntu1.2
1.2.25-1build1
1.2.25-1build1
2:1.1.2-2
1:3.5.12-1
1.1.29-5ubuntu0.1
1.6.1-2ubuntu2
0.1.7-2ubuntu3
0.5.2-4ubuntu1
1.3.3+dfsg-2ubuntu1
4.5ubuntu1
1.173.8
4.15.0.54.56
4.15.0-29.31
4.15.0-29.31
4.15.0-54.58
4.15.0-54.58
4.15.0.54.56
4.15.0-29.31
4.15.0-54.58
4.15.0.54.56
4.15.0-29.31
4.15.0-54.58
4.15.0-29.31
4.15.0-54.58
2.27-3ubuntu1
1:4.5-1ubuntu2
3.11.0-0.1ubuntu1
9.20170808ubuntu1
9.20170808ubuntu1
02.18-0.1ubuntu6.18.04.1
4.89+dfsg-0.1
0.7.3-6ubuntu1
2.02.176-4.1ubuntu3.18.04.1
3.0.3-0ubuntu1~18.04.1
3.0.3-0ubuntu1~18.04.1
3.0.3-0ubuntu1~18.04.1
2.8.3-2ubuntu0.1
4.15-1
1.3.3-17ubuntu3
4.1~rc1-3~ubuntu18.04.2
3.60ubuntu1
0.26-2ubuntu3.1
3.6.3-0ubuntu1
1:3.6.3-0ubuntu1.1
1:3.6.3-0ubuntu1.1
1:3.6.3-0ubuntu1.1
1:3.6.3-0ubuntu1.1
2.31.1-0.4ubuntu3.3
0.92-1
2.27-3ubuntu1
2.9.3-2
6.1-1ubuntu1.18.04
6.1-1ubuntu1.18.04
6.1-1ubuntu1.18.04
1.60+git20161116.90da8a0-1ubuntu1
5.4
1.187-1ubuntu0.1
0.97-0ubuntu1~18.04.1
1.7-0ubuntu3.3
1:1.3.4-2.1ubuntu5.2
1.14.0-0ubuntu1.2
1.14.0-0ubuntu1.2
0.97-0ubuntu1~18.04.1
1:2017.3.23-2ubuntu0.18.04.2
2.0.874-5ubuntu2.7
2:10.3.10-1~ubuntu0.18.04.1
1:7.6p1-4ubuntu0.3
1:7.6p1-4ubuntu0.3
1:7.6p1-4ubuntu0.3
1.1.1-1ubuntu2.1~18.04.4
1.74ubuntu1
0.40ubuntu1.1
3.2-20ubuntu0.2
1:4.5-1ubuntu2
1.5-2
2.7.6-2ubuntu1
1:3.5.2-1ubuntu1.1
5.26.1-6ubuntu0.3
5.26.1-6ubuntu0.3
5.26.1-6ubuntu0.3
2.4-1
1.1.0-1
0.9.3-1ubuntu7.18.04.2
0.9.3-1ubuntu7.18.04.2
0.105-20ubuntu0.18.04.5
4.33-0ubuntu1~18.04.1
1.66ubuntu1
10+190
10.9-0ubuntu0.18.04.1
10+190
10.9-0ubuntu0.18.04.1
190
190
10+190
10+190
10.9-0ubuntu0.18.04.1
1.33
2:3.3.12-3ubuntu1.1
23.1-1ubuntu0.1
20180223.1310-1
2.7.15~rc1-1
1.6.4
2.7.15~rc1-1
2.7.15-4ubuntu4~18.04
2.7.15-4ubuntu4~18.04
3.6.7-1~18.04
2.20.9-0ubuntu7.7
1.6.4
0.24.0-1
17.4.0-2
0.6.0-1
2018.1.18-2
1.11.5-1
3.0.4-1
6.7-3
0.3.7-1
18.04.5
5.0.6-2
15.1.0-1
2.1.4-1ubuntu1.3
1.2.6-1
1.5.66ubuntu1
0.1.32
0.18ubuntu0.18.04.1
1:18.04.34
3.6.8-1~18.04
3.26.1-2ubuntu1
0.9.2+dfsg-1ubuntu0.1
17.3.1-2
2.6-1
16.10.1-3
3.6.7-1~18.04
0.10.4-0.1build4
0.52.20-1ubuntu1
17.5.0-1ubuntu1
0.4.2-13.2ubuntu4
39.0.1-2
2.20.9-0ubuntu7.7
0.4.2-3
0.2.1-0.2
2.18.4-2ubuntu0.1
0.1.5-3
3.4-2
16.0.0-2
1.11.0-2
0.96.24.32.9
234-1build1
17.9.0-2
17.9.0-2
1:18.04.11.10
1.22-1ubuntu0.18.04.1
3.12-1build2
4.3.2-1build2
3.6.8-1~18.04.1
3.6.8-1~18.04.1
3.6.10-1
7.0-3
5:4.0.9-1ubuntu0.2
5:4.0.9-1ubuntu0.2
0.2.3-0.6
3.1.2-2.1ubuntu1
8.32.0-1ubuntu4
1.17-0ubuntu1
4.6.2-1ubuntu1
4.4-2
0.0.12
1.9-2
2.39.2+18.04
0.96.24.32.9
3.6-1ubuntu0.18.04.2
1:4.3-6ubuntu0.18.04.1
5.7-0ubuntu1.1
1.0.39
4.21-1ubuntu1
1.8.21p2-3ubuntu1
11.6.1-1
237-3ubuntu10.24
237-3ubuntu10.24
2.88dsf-59.10ubuntu1
1.29b-2ubuntu0.1
3.34ubuntu11
3.34ubuntu11
4.9.2-3
0.17-41
1.7-25.1build1
2.6-3ubuntu0.1
2019b-0ubuntu0.18.04
17
2018.09.18.1~18.04.0
1.417.1
1:18.04.34
1.417.1
1.417.1
3.0038
237-3ubuntu10.24
0.36-0ubuntu0.18.04.1
1:4.5-1ubuntu2
1.1ubuntu1.18.04.11
1:18.04.11.10
3.192.1.7
0.100.0-21
1:007-4build1
2.31.1-0.4ubuntu3.3
2.31.1-0.4ubuntu3.3
2:8.0.1453-1ubuntu1.1
2:8.0.1453-1ubuntu1.1
2:8.0.1453-1ubuntu1.1
2:8.0.1453-1ubuntu1.1
1.19.4-1ubuntu2.2
0.52.20-1ubuntu1
2018.05.09-0ubuntu1~18.04.1
1:1.0.10-1
3.0.11-dfsg-1ubuntu1
0.17-1ubuntu1
4.9.0+nmu1ubuntu2
2.23.1-1ubuntu1
2:8.0.1453-1ubuntu1.1
5.2.2-1.3
1:4.4.4-1+bionic
1.0.4-1
1:1.2.11.dfsg-0ubuntu2
"""#
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