import Foundation
let pattern = ##"^(?#day)(?>(?<day>[0-9]+)(?:(d$)|(d(?=[0-9]))|(:(?=[0-9]+(:|h)[0-9]+(:|m)[0-9]+))))?(?#dayEnd )(?#hour)(?>(?<hour>[0-9]+)(?:(h$)|(h(?=[0-9]))|(:(?=[0-9]+(:|m)[0-9]+))))?(?#hourEnd )(?#min)(?>(?<min>[0-9]+)(?:(m$)|(m(?=[0-9]))|(:(?=[0-9]))))?(?#minEnd )(?#sec)(?>(?<sec>[0-9]+((\.|\,)[0-9]*)?)(?:s|$))?(?#secEnd )(?#msec)(?>(?<msec>[0-9]+)(?:(ms$|$)))?(?#msec)$"##
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
10s55
10:10s44
10:10s
10:15s
10d99h88m77s66ms
99h88m77.66s
99h88m77.66
99:88:77.66
999999d888888:77,66
10:99:88:77.66
99:88:77,66s
88h55:77
99h
88m
77
77.5
77s
77.66s
77.66s
88m
55ms
10d55ms
100m
3600s
59:59
59m59s99ms
24:59:59.99
1:24:59m59.123
59:59.0
59.0
1d50ms
10:123
"""#
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