【问题标题】:How to combine regular expressions in Swift?如何在 Swift 中组合正则表达式?
【发布时间】:2019-05-22 02:28:10
【问题描述】:

我有以下单独的正则表达式我想使用 AND 条件组合它们,我正在使用它们来验证密码

.[A-Z]+. - 验证大写(一个字母大写最小)

.[0-9]+. - 验证数字(至少一个数字)

.[a-z]+. - 验证小写字母(最少一个小写字母)

.{8,} - 验证最小字符 8

.[^A-Za-z0-9]. - 验证特殊字符(至少一个特殊字符)

(.)\1 - 验证连续字符(无连续字符)

现在我正在分别验证每个字符,但我只想在一个函数中进行验证

我尝试了以下组合方式

/^((.)\1)(.[A-Z]+.)(.[a-z]+.)(.[0- 9]+.)(.[^A-Za-z0-9].).*$/

上面没有所有的表达方式,但我试图展示我是如何做到的。

【问题讨论】:

  • 如果您用英语解释您的字符串必须匹配的规则,那将非常有帮助。显示好的字符串的清晰示例并显示坏字符串的清晰示例并说明它们为什么不好。
  • 最好单独进行,这样您就可以向用户提供有关密码要求的反馈
  • @rmaddy 我的错,添加解释
  • @LeoDabus 实际上它导致了嵌套 if else 的糟糕代码,我不想显示任何特定消息
  • @vishaldharankar stackoverflow.com/questions/31954416/…。顺便说一句,您可以使用新的字符属性来进行字符串验证,而无需使用正则表达式

标签: ios swift regex regex-negation regex-group


【解决方案1】:

一种选择是使用一组使用negated character classes 的正向前瞻:

^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?!.*(.)\1)(?=[a-zA-Z0-9]*[^A-Za-z0-9\s])\S{8,}$

这将匹配:

  • ^ 字符串开始
  • (?=[^A-Z]*[A-Z])断言大写
  • (?=[^a-z]*[a-z])断言小写
  • (?=[^0-9]*[0-9])断言数字
  • (?!.*(.)\1) 断言没有连续的字符
  • (?=[a-zA-Z0-9]*[^A-Za-z0-9\s]) 断言未列出的字符,包括空格字符(假设不允许这样做)
  • \S{8,} 匹配 8+ 次非空白字符
  • $字符串结束

Regex demo

请注意,\S 允许的字符是广泛匹配,您可以使用字符类指定允许匹配的内容。

【讨论】:

  • 谢谢,现在就试一试
  • 没有工作尝试“Vishal123@”它说不匹配。
  • 这里是代码-------- func validate() -> Bool { // let capitalLetterRegEx = "/^((.)\\1)(.*[A-Z] +.*)(.*[a-z]+.*)(.*[0-9]+.*)(.*[^A-Za-z0-9].*).*$/" 让大写字母RegEx = "^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=.*(.) \\1)(?=[a-zA-Z0-9]*[^A-Za-z0-9\\s])\\S{8,}$" let texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx) 保护 texttest.evaluate(with: "Vishal456!") else { return false } return true }
  • @vishaldharankar 这是因为Vishal456! 不包含连续字符参见regex101.com/r/SZmCWe/2
  • 实际上可能是我的解释误导了我的意思是没有连续的字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多