如何使用Swift验证格式为123-45-6789的美国社会安全号码(SSN)?
如何用Swift验证美国社会安全号码(SSN)格式(123-45-6789)
在Swift里验证字符串是否符合美国SSN的标准格式(XXX-XX-XXXX),用正则表达式是最直接高效的方式,毕竟格式规则非常明确。我给你整理两种方案,按需选择:
方案1:仅验证格式匹配
如果你只需要检查字符串是否严格遵循123-45-6789的结构(3位数字-2位数字-4位数字),可以给String加一个扩展属性,用简单的正则表达式来匹配:
extension String { var isValidSSNFormat: Bool { // 先去除前后可能的空格,处理用户输入失误的情况 let trimmedString = self.trimmingCharacters(in: .whitespacesAndNewlines) // 正则表达式:开头到结尾必须是 3数字-2数字-4数字 let ssnPattern = #"^\d{3}-\d{2}-\d{4}$"# let predicate = NSPredicate(format: "SELF MATCHES %@", ssnPattern) return predicate.evaluate(with: trimmedString) } }
使用示例:
let validSSN = "123-45-6789" print(validSSN.isValidSSNFormat) // 输出 true let invalidWithoutDashes = "123456789" print(invalidWithoutDashes.isValidSSNFormat) // 输出 false let invalidWrongStructure = "12-345-6789" print(invalidWrongStructure.isValidSSNFormat) // 输出 false let invalidWithLetters = "abc-45-6789" print(invalidWithLetters.isValidSSNFormat) // 输出 false
方案2:更严格的SSN规则验证
真实的SSN除了格式要求,还有一些数字组合是无效的(比如前3位不能是000、666,中间两位不能是00,最后4位不能是0000等)。如果需要验证这些规则,可以用更严谨的正则表达式:
extension String { var isValidSSN: Bool { let trimmedString = self.trimmingCharacters(in: .whitespacesAndNewlines) // 正则解释: // ^(?!000|666)[0-8]\d{2}:前3位不能是000/666,且第一位不能是9 // -(?!00)\d{2}:中间两位不能是00 // -(?!0000)\d{4}$:最后4位不能是0000 let strictSSNPattern = #"^(?!000|666)[0-8]\d{2}-(?!00)\d{2}-(?!0000)\d{4}$"# let predicate = NSPredicate(format: "SELF MATCHES %@", strictSSNPattern) return predicate.evaluate(with: trimmedString) } }
使用示例:
let invalidSSN1 = "000-45-6789" // 前3位是000 print(invalidSSN1.isValidSSN) // 输出 false let invalidSSN2 = "123-00-6789" // 中间两位是00 print(invalidSSN2.isValidSSN) // 输出 false let validStrictSSN = "123-45-6789" print(validStrictSSN.isValidSSN) // 输出 true
小提示
- 如果你不需要处理前后空格,可以去掉
trimmingCharacters那一行,完全严格匹配输入字符串。 - 正则表达式里的
\d等价于[0-9],用来匹配数字字符。 NSPredicate的SELF MATCHES会检查整个字符串是否完全符合正则规则,不会出现部分匹配的情况。
内容的提问来源于stack exchange,提问作者Tung Fam
相关产品推荐
相关产品推荐

