【问题标题】:RegEx: Non-repeating patterns?正则表达式:非重复模式?
【发布时间】:2016-01-11 14:27:15
【问题描述】:

我正在为如何编写特定的正则表达式而苦苦挣扎,并认为我会来这里寻求一些指导。

我正在寻找的是执行以下操作的表达式:

  • 字符长度为 7 或更多
  • 任何单个字符都是四种模式之一(大写字母、小写字母、数字和一组特定的特殊字符。比如说 #$%@)。

(现在,这是我遇到问题的地方):

  • 另一个单个字符也将与上述模式之一匹配,但已匹配的模式除外。因此,如果匹配的第一个模式是大写字母,则匹配的第二个字符应该是模式中的小写字母、数字或特殊字符。

举个例子,字符串 AAAAAA# 会匹配,字符串 AAAAAAa 也会匹配。但是,字符串 AAAAAAA 和字符串 AAAAAA& 也不会(因为 & 符号不是特殊字符模式的一部分)。

有什么想法吗?谢谢!

【问题讨论】:

  • 换句话说,您要查找 7 个或更多字符,其中至少包含来自四个组中的两个组的字符?
  • 使用环视,很简单。
  • AaAAAAaa 匹配吗?
  • @brunch875 - 是的,它会的。 A & a 将满足来自四个模式组中的两个的匹配要求。
  • 旁注:为什么它必须是正则表达式?因为这看起来像是一个密码正则表达式。

标签: regex string nsregularexpression


【解决方案1】:

首先,您需要进行负前瞻,以确保整个字符串不包含来自单个组的字符:

(?!(?:[a-z]*|[A-Z]*|[0-9]*|[#$%@]*)$)

然后检查它是否确实包含合法字符列表中的至少 7 个字符(仅此而已):

^[a-zA-Z0-9#$%@]{7,}$

将它们结合起来(感谢Shlomo 指出这一点):

^(?!(?:[a-z]*|[A-Z]*|[0-9]*|[#$%@]*)$)[a-zA-Z0-9#$%@]{7,}$

【讨论】:

  • 您可以将这两个组合成一个正则表达式:^(?!^(?:[a-z]*|[A-Z]*|[0-9]*|[#$%@]*)$)[a-zA-Z0-9#$%@]{7,}$
  • @Shlomo Heh... 非常正确。编辑它。谢谢!
【解决方案2】:

如果只需要两种不同的字符,可以使用所有格量词功能(Objective C 中提供):

^(?:[a-z]++|[A-Z]++|[0-9]++|[#$%@]++)[a-zA-Z0-9#$%@]+$

或更简洁的原子组:

^(?>[a-z]+|[A-Z]+|[0-9]+|[#$%@]+)[a-zA-Z0-9#$%@]+$

由于交替的每个分支都是一个带有所有格量词的字符类,因此您可以确定[a-zA-Z0-9#$%@]+ 匹配的第一个字符来自不同的类。

关于字符串大小,先用相应的函数单独检查,如果大小太小,可以避免正则表达式检查的成本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 2016-11-16
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2020-09-07
    相关资源
    最近更新 更多