import Foundation
let pattern = ##"""
^
(?<FirstLine> # First line capturing group
(?<Passport>P) # Passport character capturing group (P char, length 1)
(?<PassportType>.) # Passport Type (any char, generally <, length 1)
(?<IssuingCountry>[AFG]{3}) # To be completed with the ISO 3166-1 alpha-3 country codes (length 3)
# Or in alternative it can be checked for char only as
# (?<IssuingCountry>[A-Z<]{3}) if check state not necessary
(?<PassportOwner> # Passport owner capturing group !Does not check for length 39!
(?<Surname>[A-Z]+) # Surname, it has to be followed by <<
<<
(?<GivenName> # Given Name
(?:[A-Z]+<?)+
)
[<]+
){1}
)
\n
(?<SecondLine> # Second Line capturing group
(?<PassportNumber>[A-Z0-9<]{9}) # Passport number, length 9, padded with <
(?<CheckDigit19>[0-9]{1}) # Check digit for position 1 to 9
(?<Nationality>\g{IssuingCountry}) # Nationality, follows the same rule as match group 4
(?<DoB> # Date Of Birth
(?<DoBYear>[0-9]{2})
(?<DoBMonth>(?:0[1-9]|1[0-2]))
(?<DoBDay>(?:0[1-9]|(?:1|2)[0-9]|3[01]))
)
(?<CheckDigit1419>[0-9]) # Check digit for position 14 to 19
(?<Sex>[MF<]) # Sex (Male, Female or not defined)
(?<Expiral> # Expiral date
(?<ExpiralYear>[0-9]{2}) # W
(?<ExpiralMonth>(?:0[1-9]|1[0-2]))
(?<ExpiralDay>(?:0[1-9]|(?:1|2)[0-9]|3[01]))
)
(?<CheckDigit2227>[0-9]) # Check digit for position 22 to 27
(?<PersonalNumber>[A-Z0-9<]{14}) # Personal number padded with <
(?<CheckDigit2942>[0-9<]) # Check digit for position 29 to 42 (can be < empty)
(?<CheckDigitF>[0-9]) # Check digit
)
$
"""##
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .allowCommentsAndWhitespace])
let testString = #"""
P<AFGERIKSSON<<ANNA<MARIA<<<<<<<<<<<<<<<<<<<
L898902C<3AFG6908061F9406236ZE184226B<<<<<14
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let substitutionString = #""#
let lookupRange = (testString as NSString).range(of: pattern, options: .regularExpression, range: stringRange)
if lookupRange.intersection(stringRange) != nil {
let result = regex.stringByReplacingMatches(in: testString, range: lookupRange, withTemplate: substitutionString)
print(result)
} else {
print("No matches were found.")
}
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