为社会安全号码Swift创建一个功能

时间:2015-11-21 02:18:36

标签: ios regex swift

我试图创建一个让用户在Parse中编写社会安全号码的功能,如下所示:YYMMDD-XXXX

这是我的代码:

func isValidBirth() -> Bool {
    let birthEX = "[00-99]+@[1-12]+@[1-31]+\\-[0000-9999]"
    let range = birthField!.rangeOfString(birthEX, options:.RegularExpressionSearch)
    let result = range != nil ? true : false
    return result
}

每次我尝试注册时,都会收到此错误,表示我没有正确编写社会安全号码。

我认为我创建此功能是错误的,因为我还是初学者。 :)

如何创建一个让USER编写社会安全号码的功能?或者,如果我现在做得对,为什么它不起作用?

1 个答案:

答案 0 :(得分:1)

让我澄清一件事:你想要的不是美国式的社会安全号码。美国的SSN没有生日。我将其解释为您想要创建自己的SSN方案或其他国家/地区的SSN方案。

无论如何,不​​要指望正则表达式引擎将[00-99]理解为“00到99”。方括号表示“匹配里面的任何字符”。这就是正则表达式如何解释它:

[
    0     - match the character 0; or
    0-9   - match any character 0 to 9; or
    9     - match the character 9
]

所以最后,这相当于[0-9]。您需要修改正则表达式模式:

func isValidBirth(str: String) -> Bool {
    let birthEx = "\\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\\d|3[0-1])-\\d{4}"
    let range = str.rangeOfString(birthEx, options:.RegularExpressionSearch)
    return range != nil
}

isValidBirth("920101-1234") // true
isValidBirth("120231-4321") // true, but this is Feb 31 !!!
isValidBirth("151120-123")  // false

关于正则表达式:

\\d{2}                      - the year: any 2 digits
(0[1-9]|1[0-2])             - the month: 01 - 09, or 10 - 12
(0[1-9]|[1-2]\\d|3[0-1])    - the day: 01 - 09, 10 - 29, or 30 - 31
-                           - the literal dash character
\\d{4}                      - any four-digit number

有一些明显的警告:(1)当你以2位数格式写年份时,确切的年份是模棱两可的。 15可以是19152015; (2)它不验证当天,即2月31日是有效日。