import Foundation
let pattern = #"(?<!SQ\d{0}|\d|\d{2})(51\d{14}|52\d{14}|53\d{14}|54\d{14}|55\d{14}|36\d{12}|34\d{13}|37\d{13}|4\d{15}|4\d{12}|\d{4}(-|\s)\d{4}(-|\s)\d{4}(-|\s)\d{4}|\d{3}(-|\s)\d{3}(-|\s)\d{3}(-|\s)\d{3}(-|\s)\d{3}|\d{4}(-|\s)\d{6}(-\s)\d{5}|6\d{15})"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = ##"""
<Payment>
<PCard expiration="2061-04-00" name="Grainger AB" number="41111111111111114222222222222"/>
</Payment>
<PCard expiration="2022-04" number="4005-5511-2233-4450"/>
<Payment>
Space
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
Tab space
<PCard expiration="2022-04" number="4005 551122334450"/>
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
new line
<PCard expiration="2022-04" number="4005400540054005"/>
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
carriage return
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
</Payment>
combination of
<Payment>
<PCard expiration="2022-04" number="4005- 5511 -2233-4450"/>
</Payment>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="@#@@@$@4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="SQ#4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="45a$4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="12SQ%4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010@121212"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010#SQ"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010$a54"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010%SQ12"/>
<SupplierPartID>4222222222222</SupplierPartID>
<SupplierPartID> 4222222222222</SupplierPartID>
<SupplierPartID>SQ4222222222222</SupplierPartID>
<SupplierPartID>SQ134222222222222</SupplierPartID>
<SupplierPartAuxiliaryID>WWGSQ134256726800010</SupplierPartAuxiliaryID>
"""##
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