import Foundation
let pattern = #"^.*TELEPHONE NUMBER(.*)DATE ACCOUNT OPENED(.*)LANG CODE(.*)CHAIN CODE(.*)TRANSIT ROUTING NUM(.*)DATE OF LAST REVIEW(.*)DATE OF NEXT REVIEW(.*)ALT TRANSIT ROUTING NUM(.*)AVERAGE FLOAT DAYS(.*)SPECIAL CONTROL FLAGS(.*)SEASONAL MERCHANT(.*)STATEMENT HOLD CODE(.*)SEND ACQUIRER(.*)STATEMENT MAIL FLAG(.*)MONTHLY ACH FLAG(.*)MERCHANT NAME(.*)MERCHANT TYPE(.*)DDA NUMBER(.*)ALT DDA NUMBER(.*)AUTH INC GRID(.*)AUTH EXP GRID(.*)CROSS REFERENCE NO.(.*)ETC NON FDR FLAG(.*)ETC VENDOR ID(.*)SALES RESPONSIBILITY(.*)USER DEF INC GRID(.*)USER DEF EXP GRID(.*)TAXPAYER ID(.*)ACCOUNT1 FEE FLAG(.*)ACCOUNT1 START(.*)STOP(.*)MRCH ADV FLAG(.*)ACCOUNT2 FEE FLAG(.*)ACCOUNT2 START(.*)STOP(.*)TERMINAL START(.*)STOP(.*)ACCOUNT3 FEE FLAG(.*)ACCOUNT3 START(.*)STOP(.*)SPARK EXCLUSION CD(.*)ACCOUNT4 FEE FLAG(.*)ACCOUNT4 START(.*)STOP(.*)PAYEE FLAG CD(.*)ACCOUNT5 FEE FLAG(.*)ACCOUNT5 START(.*)STOP(.*)EIDS IND(.*)RECURRING FEE FLAG(.*)RECURRING FEE IND(.*)BUW INDICATOR(.*)TURF CD(.*)TURF EFF DT(.*)TAX EFF YEAR(.*)BANKCARD DBA(.*)TIMS ACCT ID(.*) RETAIL   DBA(.*)CUST BUSINESS ID(.*)CUST BUS RELATIONSHIP CD(.*)DEPOSIT TYPE(.*)ETC ACCOUNT TYPE(.*)DEVICE TYPE(.*)EXCLUDE ADJ FLAG(.*)MC\/V POS(.*)DISCOUNT CALCULATION(.*)ROUND DISCOUNT(.*)REBATE DISTRIBUTE(.*)REBATE OPTION(.*)REBATE PERIOD(.*)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
0                                                   TELEPHONE NUMBER  612-874-8702            DATE ACCOUNT OPENED  01/27/14
 LANG CODE - EN                                     CHAIN CODE                                TRANSIT ROUTING NUM   96001013
 DATE OF LAST REVIEW 00/00                          DATE OF NEXT REVIEW   01/15               ALT TRANSIT ROUTING NUM
 AVERAGE FLOAT DAYS  00-00                          SPECIAL CONTROL FLAGS                     SEASONAL MERCHANT    NO
 STATEMENT HOLD CODE Y - SEND ACQUIRER              STATEMENT MAIL FLAG   M - MERCH ADDRESS   MONTHLY ACH FLAG     1 - MERCHANT NAME
 MERCHANT TYPE       REGULAR                        DDA NUMBER            12000069001         ALT DDA NUMBER
 AUTH INC GRID       P801                           AUTH EXP GRID          000                CROSS REFERENCE NO.   0000326
 ETC NON FDR FLAG    N                              ETC VENDOR ID                             SALES RESPONSIBILITY  0001
 USER DEF INC GRID    000                           USER DEF EXP GRID      000                TAXPAYER ID   30-0016022
 ACCOUNT1 FEE FLAG 3                                ACCOUNT1 START 00/00  STOP 00/00          MRCH ADV FLAG        0
 ACCOUNT2 FEE FLAG 1                                ACCOUNT2 START 00/00  STOP 00/00          TERMINAL START 00/00  STOP 00/00
 ACCOUNT3 FEE FLAG 1                                ACCOUNT3 START 00/00  STOP 05/17          SPARK EXCLUSION CD   N
 ACCOUNT4 FEE FLAG 0                                ACCOUNT4 START 00/00  STOP 00/00          PAYEE FLAG CD   S
 ACCOUNT5 FEE FLAG 1                                ACCOUNT5 START 00/00  STOP 00/00          EIDS IND   N
 RECURRING FEE FLAG                                 RECURRING FEE IND                         BUW INDICATOR
 TURF CD A                                          TURF EFF DT 00/00/0000                    TAX EFF YEAR 0000
 BANKCARD DBA - ACADIA CAFE              /MINNEAPOLIS  /MN                                    TIMS ACCT ID O0529808390100022000
 RETAIL   DBA - ACADIA CAFE              MINNEAPOLIS  MN
 CUST BUSINESS ID                                   CUST BUS RELATIONSHIP CD
 - - - - - - - - - - - - - - - - - - - - - - - - - - - -  MERCHANT OPTIONS  - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 DEPOSIT TYPE        3 - ETC                        ETC ACCOUNT TYPE      7 - RESERVED        DEVICE TYPE          NONE
                                                    EXCLUDE ADJ FLAG      Y - EXCL ADJ/CB     MC/V POS             0922
 DISCOUNT CALCULATION -  2  ROUND DISCOUNT -  N
 REBATE DISTRIBUTE                                  REBATE OPTION         N - NO REBATE       REBATE PERIOD           
"""#
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