【发布时间】:2011-08-03 16:09:37
【问题描述】:
如果我有一组像“abcdefghij”这样的字符并使用这些字符,我会使用这些字符随机生成一个密码。例如,生成的密码可以有 6 个字符。如何使用正则表达式验证密码,以使相邻字符不相同且字符不会重复超过两次?
【问题讨论】:
-
用什么编程语言?
标签: java regex character repeat
如果我有一组像“abcdefghij”这样的字符并使用这些字符,我会使用这些字符随机生成一个密码。例如,生成的密码可以有 6 个字符。如何使用正则表达式验证密码,以使相邻字符不相同且字符不会重复超过两次?
【问题讨论】:
标签: java regex character repeat
你可以使用类似的东西:
/^
(?:(.)
(?!\1) # neighbor characters are not identical
(?!(?>.*?\1){2}) # character does not occur more than twice
)*
\z/x
Perl 引用,如果不支持原子组可以删除。
在 Java 正则表达式中可以这样写:
^(?:(.)(?!\1|(?:.*?\1){2}))*\z
【讨论】:
AFAIK,这不能用一个简单的正则表达式来完成(特别是,确保一个字母最多只出现两次。你可以做一堆表达式,比如
[^a]*(a[^a]*(a[^a]*))
[^b]*(b[^b]*(b[^b]*))
....
还有(匹配意味着验证失败):
[^a]*aa[^a]*
[^b]*bb[^b]*
但显然这不是个好主意。
字符不一起重复的情况也许可以用捕获组来处理,但我几乎可以肯定另一个不能用正则表达式检查。
顺便说一句...为什么对正则表达式如此着迷?编写这些检查很简单,正则表达式在一组情况下很有用,但并非每项检查都可以用正则表达式完成。
【讨论】: