使用正则表达式验证用户名
Validate Username with 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)
}
}
现在有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)
}
}
我正在制作注册表。它具有以下要求:
- 可以包含大小写字母、数字和字符集
- 不得包含空格
- 长度从 5 到 16 个字符
我会这样检查字符串。
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)
}
}