使用正则表达式验证用户名
Posted
技术标签:
【中文标题】使用正则表达式验证用户名【英文标题】:Validate Username with regex 【发布时间】:2021-03-31 13:40:24 【问题描述】:我正在开发注册表单。它有以下要求:
可以包含大写和大写字母、数字和字符集 不得包含空格 长度为 5 到 16 个字符我会这样检查字符串。
extension String
var isValidUsername: Bool
let predicate = NSPredicate(format: "SELF MATCHES %@ ", "^(?=.*[A-Za-z0-9!@#$%^&*()._-]).5,16$")
return predicate.evaluate(with: self)
现在有两个问题我可以输入空格,虽然我不应该。我可以使用列出的字符以外的字符。我该如何解决这个问题?
【问题讨论】:
只是不要使用正则表达式,没有空格约束很容易完成,长度约束也是如此。在这里使用正则表达式真的没有意义。 考虑这样的方法:***.com/a/66003170/5318223 你放(任何字符)。在正则表达式中,您应该对其进行转义:\.并且还压制。 5,16 之前 正则表达式的另一种替代方法,***.com/a/62425699/9223839 【参考方案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)
【讨论】:
以上是关于使用正则表达式验证用户名的主要内容,如果未能解决你的问题,请参考以下文章