import Foundation
let pattern = #"\s+TRN\s+[a-z\d]+\s+\d+\s+(\s+\d+\s+)\w+(\s+\d{2}\w{3}\s+)\d\s([a-z]{5})\s+([a-z]{5})\s[a-z\d]+\s+[\D]+(\d{4}|\d{0})\s+(\d{4}|\d{0})"#
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let testString = #"""
4 TRN 2C 87 6628 AF 26NOV 4 FRLPD FRPLY HK1 1800 2007
3 TRN 2C 87 5266 BI 16NOV 1 FRBOJ FRMLV HK PAST 3333 3333*
4 TRN 2C 87 5454 BI 19NOV 4 FRMLV FRBOJ HK PAST *
3 TRN 2C 87 5266 BI 16NOV 1 FRBOJ FRMLV HK PAST *
4 TRN 2C 87 5454 BI 19NOV 4 FRMLV FRBOJ HK PAST *
3 TRN 2C 87 6609 AF 23NOV 1 FRPLY FRLPD HK PAST *
4 TRN 2C 87 6628 AF 26NOV 4 FRLPD FRPLY HK1 1800 2007
3 TRN 2C 87 6817 AF 25NOV 3 FRLPD FRBZR HK1 1810 2047
FRLPD/LYON PART DIEU//FRBZR/BEZIERS /TGD *
4 TRN 2C 87 6860 AF 27NOV 5 FRBZR FRLPD HK1 1618 1850
FRBZR/BEZIERS//FRLPD/LYON PART DIEU /TGD *
3 TRN 2C 87 6201 BF 23NOV 1 FRPLY FRVLA HK PAST *
4 TRN 2C 87 6194 BF 24NOV 2 FRVAF FRPLY HK1 0843 1110
FRVAF/VALENCE VILLE//FRPLY/PARIS GARE LYON /TGD *
3 TRN 2C 87 3101 B 24NOV 2 FRPSL FRAEZ HK1 0653 0903
FRPSL/PARIS ST LAZARE//FRAEZ/LE HAVRE /TIB *
4 TRN 2C 87 3130 A 25NOV 3 FRAEZ FRPSL HK1 1757 2010
FRAEZ/LE HAVRE//FRPSL/PARIS ST LAZARE /TIB *
3 TRN 2C 87 6700 BF 26NOV 4 FRAEK FRPLY HK1 0542 0837
FRAEK/MULHOUSE VILLE//FRPLY/PARIS GARE LYON /TGD *
4 TRN 2C 87 9223 BF 27NOV 5 FRPLY FRAEK HK1 1823 2103
FRPLY/PARIS GARE LYON//FRAEK/MULHOUSE VILLE /TGL *
3 TRN 2C 87 5352 BF 26NOV 4 FRLPD FRDJU HK1 0629 0835
FRLPD/LYON PART DIEU//FRDJU/MASSY TGV /TGD *
4 TRN 2C 87 5233 BF 26NOV 4 FRDJU FRRNS HK1 1538 1747
FRDJU/MASSY TGV//FRRNS/RENNES /TGA *
5 TRN 2C 87 5346 BF 27NOV 5 FRRNS FRLPD HK1 1609 2030
FRRNS/RENNES//FRLPD/LYON PART DIEU /TGD *
3 TRN 2C 87 6602 BF 30NOV 1 FRLPD FRPLY HK1 0602 0813
FRLPD/LYON PART DIEU//FRPLY/PARIS GARE LYON /TGD *
4 TRN 2C 87 6629 BF 04DEC 5 FRPLY FRLPD HK1 1857 2057
FRPLY/PARIS GARE LYON//FRLPD/LYON PART DIEU /TGD
"""#
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