RegEx:非重复模式?

问题描述:

我正在琢磨如何编写一个特定的正则表达式,并认为我会来这里寻求一点指导。RegEx:非重复模式?

我正在寻找的是,做以下的表达式:

  • 的7字符长度以上
  • 任何单个字符是四个模式之一(大写字母,小写字母,数字和一组特殊字符,比如#$%@)。

(现在,这里的地方我有问题):

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

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

任何想法?谢谢!

+2

换句话说,你正在寻找7个或更多的字符,其中包括来自四个组中至少两个的字符? – glibdud

+0

使用lookarounds,它很容易。 – sln

+0

@glibdud的确如此。 –

首先,你需要做一个负前瞻,以确保整个字符串不会从一个组由字符:

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

然后检查其确实含有至少7个字符合法字符列表(没有别的):

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

结合他们(感谢Shlomo指出了这一点):

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

你可以将这两个结合成一个正则表达式:'^(?!^(?:[az] * | [AZ] * | [0-9] * | [#$%@] *) $)[a-zA-Z0-9#$%@] {7,} $' – Shlomo

+0

@Shlomo Heh ...很对。编辑它,谢谢! – glibdud

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

关于字符串大小,请先用适当的函数单独检查它,如果大小太小,您将避免正则表达式检查的成本。