import Foundation
let pattern = #"^REMARK[^\r\n]+([\r\n]+)@ID"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
[H[2JLIST F.PROTOCOL @ID PROTOCOL.ID PROCESS.DATE TIME.MSECS K.USER APPLICATION LEVEL.FUNCTION ID REMARK PAGE 1 11:34:02 23 NOV 2023
@ID............ 202309260081340532.21
@ID............ 202309260081340532.21
PROTOCOL.ID.... 202309260081340532.21
PROCESS.DATE... 20230926
TIME.MSECS..... 11:15:32:934
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202309260081340523.16
@ID............ 202309260081340523.16
PROTOCOL.ID.... 202309260081340523.16
PROCESS.DATE... 20230926
TIME.MSECS..... 11:15:23:649
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202309260081340465.12
@ID............ 202309260081340465.12
PROTOCOL.ID.... 202309260081340465.12
PROCESS.DATE... 20230926
TIME.MSECS..... 11:14:25:781
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ AUTHORISER-8232
@ID............ AUTHORISER-8232
PROTOCOL.ID.... AUTHORISER-8232
PROCESS.DATE... 20230926
TIME.MSECS..... 09:08:19:962
K.USER......... AUTHORISER
APPLICATION.... PGM.BREAK
LEVEL.FUNCTION. 1
ID............. [H[2JLIST F.PROTOCOL @ID PROTOCOL.ID PROCESS.DATE TIME.MSECS K.USER APPLICATION LEVEL.FUNCTION ID REMARK PAGE 2 11:34:02 23 NOV 2023
REMARK.........
@ID............ 202309260081340530.06
@ID............ 202309260081340530.06
PROTOCOL.ID.... 202309260081340530.06
PROCESS.DATE... 20230926
TIME.MSECS..... 11:15:30:223
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202309269535047401.01
@ID............ 202309269535047401.01
PROTOCOL.ID.... 202309269535047401.01
PROCESS.DATE... 20230926
TIME.MSECS..... 13:10:01:201
K.USER......... INPUTTER
APPLICATION.... DRAWINGS
LEVEL.FUNCTION. 1 I
ID.............
REMARK.........
@ID............ 202309260081340469.10
@ID............ 202309260081340469.10
PROTOCOL.ID.... 202309260081340469.10
PROCESS.DATE... 20230926
TIME.MSECS..... 11:14:29:654
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202309260081340490.06
@ID............ 202309260081340490.06
PROTOCOL.ID.... 202309260081340490.06
PROCESS.DATE... 20230926
TIME.MSECS..... 11:14:50:299
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY [H[2JLIST F.PROTOCOL @ID PROTOCOL.ID PROCESS.DATE TIME.MSECS K.USER APPLICATION LEVEL.FUNCTION ID REMARK PAGE 3 11:34:02 23 NOV 2023
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202309260081340509.05
@ID............ 202309260081340509.05
PROTOCOL.ID.... 202309260081340509.05
PROCESS.DATE... 20230926
TIME.MSECS..... 11:15:09:201
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202309260081340529.00
@ID............ 202309260081340529.00
PROTOCOL.ID.... 202309260081340529.00
PROCESS.DATE... 20230926
TIME.MSECS..... 11:15:29:015
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202310033834745376.01
@ID............ 202310033834745376.01
PROTOCOL.ID.... 202310033834745376.01
PROCESS.DATE... 20230926
TIME.MSECS..... 12:36:16:380
K.USER......... ASHWIN.KUMAR
APPLICATION.... CATEGORY
LEVEL.FUNCTION. 1 S
ID.............
REMARK.........
@ID............ 202309260081340496.06
@ID............ 202309260081340496.06
PROTOCOL.ID.... 202309260081340496.06
PROCESS.DATE... 20230926
TIME.MSECS..... 11:14:56:370 [H[2JLIST F.PROTOCOL @ID PROTOCOL.ID PROCESS.DATE TIME.MSECS K.USER APPLICATION LEVEL.FUNCTION ID REMARK PAGE 4 11:34:02 23 NOV 2023
K.USER......... INPUTTER
APPLICATION.... AC.INWARD.ENTRY
LEVEL.FUNCTION. 1
ID.............
REMARK......... ENQUIRY - AC.INTERFACE.REPORT
@ID............ 202310031395145227.00
@ID............ 202310031395145227.00
PROTOCOL.ID.... 202310031395145227.00
PROCESS.DATE... 20230926
TIME.MSECS..... 12:33:47:173
K.USER......... ASHWIN.KUMAR
APPLICATION.... SIGN.ON
LEVEL.FUNCTION.
ID.............
REMARK.........
@ID............ TEST1-70226
@ID............ TEST1-70226
PROTOCOL.ID.... TEST1-70226
PROCESS.DATE... 20230926
TIME.MSECS..... 12:52:55:808
K.USER......... TEST1
APPLICATION.... PGM.BREAK
LEVEL.FUNCTION. 1
ID.............
REMARK.........
@ID............ 202309264115451975.00
@ID............ 202309264115451975.00
PROTOCOL.ID.... 202309264115451975.00
PROCESS.DATE... 20230926
TIME.MSECS..... 14:26:15:315
K.USER......... INPUTTER
APPLICATION.... ENQUIRY.SELECT
LEVEL.FUNCTION. 1
ID............. TRADE.POS.VALUATION_BH0010001_INPUTTER
REMARK......... 1
"""#
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