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

Validate Username with regex

我正在制作注册表。它具有以下要求:

我会这样检查字符串。

extension String {

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

        return predicate.evaluate(with: self)
    }

}

现在有2个问题我可以输入空格,虽然我不应该。我可以使用未列出的字符。我该如何解决这个问题?

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

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

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

您可以使用

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