我正在努力学习如何编写特定的正则表达式,并且认为我来这里寻求一点指导。
我正在寻找的是一个能够执行以下操作的表达式:
(现在,我在这里遇到问题):
举个例子,字符串 AAAAAA#将匹配,字符串 AAAAAAa 也是如此。但是,字符串 AAAAAAA ,字符串 AAAAAA& (因为&符号不是特殊字符模式的一部分)。
有什么想法吗?谢谢!
答案 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,}$