import Foundation
let pattern = #"\s*(\d{1}\s{9})*(\r|\n|\r\n)\s*[0-9]{80}[\r|\n|\r\n]0\s*CMD\s(?<CMD>.{18})\sADJUSTMENT\sMONETARY\sSCREEN\s{8}IAJMON\s{3}PAGE\s(?<PAGECURRENT>\d)\sOF\s(?<PAGETOTAL>\d)\s*[\r|\n|\r\n]1\s{2}SCREEN\s(?<SCREEN>.{2})\s{2}ACTION\s(?<ACTION>.{2})\s{2}RA\sNUM\s(?<RANUMBER>.{10})\s*OVRD\s(?<OVRD>.{2})INVOICE\sNUM\s(?<INVOICENUM>.{15})[\r|\n|\r\n]2.*RES\sNUM\s(?<RESNUMBER>[A-Z0-9]{11})\s(?<COMPANY>\w{1})\s*[\r|\n|\r\n]3\s*CHK\sOUT\sLOC\s(?<CHECKOUTLOC>.{3})\s*DATE\s(?<CHECKOUTDATE>.{7})\s*TIME\s(?<CHECKOUTTIME>.{5})\s*MLS\/KM\s*(?<CHECKOUTMILEAGE>.{8})\s*FUEL\s(?<CHECKOUTFUEL>.{1})\s*[\r|\n|\r\n]4\s*CHK\s*IN\s*LOC\s(?<CHECKINLOCATION>.{3})\s*DATE\s(?<CHECKINDATE>.{7})\s*TIME\s(?<CHECKINTIME>.{5})\s*MLS\/KM\s(?<CHECKINMILEAGE>.{8})\s*FUEL\s(?<CHECKINFUEL>.{1})\s*[\r|\n|\r\n]5\s*AGREED\sRETURN\s(?<AGREEDRETURNLOC>[A-Z0-9]{3})\s*DATE\s(?<AGREEDRETURNDATE>.{7})\s*TIME\s(?<AGREEDRETURNTIME>.{5})\s*MLS\/KM\sDRIVEN\s(?<MILEAGEDRIVEN>.{12})[\r|\n|\r\n]6\s*WIZARD\sNUM\s(?<WIZARDNUMBER>.{7})\sAWD\sNUM\s(?<AWDNUMBER>.{8})\s"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
0 1 2 3 4 5 6 7
01234567890123456789012345678901234567890123456789012345678901234567890123456789
0 CMD ADJUSTMENT MONETARY SCREEN IAJMON PAGE 1 OF 3
1 SCREEN 10 ACTION DS RA NUM E839020313 OVRD INVOICE NUM
2 E839020313 DS RES NUM 42423337ZA5 A
3 CHK OUT LOC CPT DATE 02JUL16 TIME 10:38 MLS/KM 11110700 FUEL 8
4 CHK IN LOC CPT DATE 05JUL16 TIME 15:36 MLS/KM 511 FUEL
5 AGREED RETURN CPT DATE 05JUL16 TIME 16:00 MLS/KM DRIVEN 404
6 WIZARD NUM AWD NUM E0193000 METH OF PAY CLUB
7 CUSTOMER NAME SMITH,NEILMR FAX NUM CD N SP/IR N
8 RATE CODE YWI A HRLY 184.21 DALY 184.21 WKY 1172.81 MTH 0.00
9 UPGRADE AMT RES QUOTED PRICE 643.33 RES/RENTAL T
10 DEFAULT RATE DESC
11 TRAVEL AGNY ACCT AV873132130055 VOUCHER NUM E42423337 ARC/IATA 0149575L
12 TRAVEL AGNY AMT 629.00 BILLING MONTH/YEAR RENT TYP RMOTE CI
13 COMMISSION AMT 177.41 COMMISSION SOURCE O EQUIP TYP CAR RNTL
14 AGENCY VAT TAX 0.00 TOUR VOUCHER BUY/SELL B CUST VOCH
15 COMMISSION QST BUY/SELL PURCHASE/SOLD
16 COMMISSION REV 806.41 RA SOLD COUNTRY INVOICE Y
17 COMMISS BASIS 3 TOUR VOUCHER SOLD COUNTRY GB DB/CR NOTE Y
18 ORI CHKOUT CURR 575.97 ORI CHKOUT CURR CODE SAR WRITE-OFF
19 ORI BILLING CURR ORI BILLING CURR CODE
20 EMPL ID PIN NUM DCC CURR DCC RATE
21 71 RA HAS NO PRIOR ADJUSTMENT 143 RA HAS 1 PAYMENT(S)
22 135 LICENSEE CHECKOUT/LICENSEE OWNER 235RA HAS BEEN MODIFIED AFTER CHECKOUT
23
"""#
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