import Foundation
let pattern = #"((C1)(.*?))?((C2)(.*?))?((C3)(.*?))?((C4)(.*?))?(\.zip|$)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
C1 Anything, Notice How The Groups Are Always The Same C2 Anything C3 Anything C4 Anything.zip
C1 Anything, The Same No Matter Which C's Are Present C2 Anything C3 Anything C4 Anything.zip
C1 Anything, This One Is An Example Of No Extension C4 Anything
C1 Anything, The File Extension Is Always Group 13 C3 Anything.zip
C2 Anything, This One Starts With "C2" C3 Anything.zip
C3 Anything, And This One Starts With "C3" C4 Anything.zip
Group 2 is always C1 and anything after is always Group 3
Group 5 is always C2 and anything after is always Group 6
Group 8 is always C3 and anything after is always Group 9
Group 11 is always C4 and anything after is always Group 12
Group 13 (the file extension) is always .zip
But, is there a way of stopping group 13 matching with the end of every line whilst still maintaining this group structure?
"""#
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