我必须验证一个字符串,该字符串可以包含1到7之间的数字,并且允许的最大长度为7.
([1-7]){0,7}
条件:字符串中不应重复数字。
例如:
12345 true;
11345 false (1 is repeated) ;
98014 false (0,8,9 are invalid);
答案 0 :(得分:3)
这可以在一个正则表达式中完成:
^(?!.*(.).*\1)[1-7]{0,7}$
前瞻断言检查字符串中的所有字符是否唯一,而实际的正则表达式只允许0到7位数在1和7之间。
在Java中:
boolean foundMatch = subjectString.matches("^(?!.*(.).*\\1)[1-7]{0,7}$");
当然,您可以使用.
替换每个[1-7]
,从而使前瞻失败更快,但为了清楚起见,我选择不这样做。 (如果您使用^
方法,则可以删除$
和.matches()
锚点,因为在这种情况下它们是隐含的。)
答案 1 :(得分:2)
我认为你必须使用两个表达式。一个用于验证长度和数字:
/^[1-7]{0,7}$/
和一个测试是否重复数字
/(\d).*\1/
\1
是对第一个捕获组的值的引用。
通过两者的组合,您可以验证字符串。 JavaScript中的示例:
< /^[1-7]{0,7}$/.test(12345) && !/(\d).*\1/.test(12345)
> true
--
< /^[1-7]{0,7}$/.test(11345) && !/(\d).*\1/.test(11345)
> false
答案 2 :(得分:1)
您可以撤销支票,即如果它与[^1-7]|.{8}|(.).*\1
匹配则检查无效。