RegEx:非重复模式?

时间:2015-10-13 17:54:41

标签: regex string nsregularexpression

我正在努力学习如何编写特定的正则表达式,并且认为我来这里寻求一点指导。

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

  • 字符长度为7或更多
  • 任何一个字符都是四种模式之一(大写字母,小写字母,数字和一组特殊字符。让我们说#$%@ )。

(现在,我在这里遇到问题):

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

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

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

如果您只需要两种不同的字符,则可以使用占有量词功能(在目标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#$%@]+匹配的第一个字符来自不同的类。

关于字符串大小,首先使用适当的函数单独检查,如果大小太小,则可以避免正则表达式检查的费用。

答案 1 :(得分: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,}$