使用正则表达式验证用户名

时间:2021-03-31 13:40:24

标签: ios swift regex nspredicate

我正在开发注册表。它有以下要求:

  • 可以包含大小写字母、数字和字符集
  • 不得包含空格
  • 长度为 5 到 16 个字符

我会像这样检查字符串。

extension String {

    var isValidUsername: Bool {
        let predicate = NSPredicate(format: "SELF MATCHES %@ ", "^(?=.*[A-Za-z0-9!@#$%^&*()._-]).{5,16}$")

        return predicate.evaluate(with: self)
    }

}

现在有两个问题我可以输入空格,但我不应该。我可以使用所列字符以外的字符。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

实际上,这里仍然可以使用正则表达式,因为只有两件事需要解决:

  • 正则表达式末尾使用的 . 模式匹配除换行符以外的任何字符,因此它可以匹配很多字符
  • 前瞻(?=.*[A-Za-z0-9!@#$%^&*()._-]) 只需要在字符类中除换行符以外的零个或多个字符之后至少列出一个字符。要仅允许来自先行的字符,请在消费模式中使用先行字符类而不是 .

注意锚点是多余的,因为 MATCHES 需要完整的字符串匹配。

您可以使用

修复代码
extension String {
    var isValidUsername: Bool {
        let predicate = NSPredicate(format: "SELF MATCHES %@ ", "[A-Za-z0-9!@#$%^&*()._-]{5,16}")
        return predicate.evaluate(with: self)
    }
}
相关问题