提问者:小点点

使用regex验证用户名


我正在编制一份登记表。它具有以下要求:

  • 可以包含大写字母、大写字母、数字和字符集
  • 不能包含空格
  • 长度从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个答案

匿名用户

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

  • regex末尾使用的.模式匹配除换行符字符以外的任何字符,因此可以匹配大量字符
  • lookahead(?=.*[a-za-z0-9!@#$%^&*()._-])只需要字符类中列出的除换行符以外的任何零个或多个字符之后至少有一个字符。若要仅允许lookahead中的字符,请使用lookahead字符类,而不是使用模式中的.

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

您可以使用

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