我想找到没有重复数字的10位数字,例如:
1123456789 //fail, there are two 1's
6758951230 //fail, there are two 5's
6789012345 //pass, each digit occurs once only.
目前我正在使用正则表达式,但只能匹配10位数字(它不会检查重复项。我正在使用此正则表达式:
[0-9]{10}
这可以用正则表达式完成还是有更好的方法来实现这个目标?
答案 0 :(得分:8)
这个正则表达式有效:
^(?!.*(.).*\1)\d{10}$
这使用一个锚定的负面向前看,后面引用断言没有重复的字符。
查看live demo使用您的示例。
在java中:
if (str.matches("^(?!.*(.).*\\1)\\d{10}"))
// number passes
答案 1 :(得分:1)
试试这个(?:([0-9])(?!.*\1)){10}
,如果您一次验证一个号码,这将有效。
这应该可以(?:([0-9])(?!\d*\1)){10}
来搜索每个10位数字序列的出现,但它会因12345678901234567890
而失败,会找到最后一个有效部分1234567890
而不是忽略它
答案 2 :(得分:1)
由于存在?
,这是最短且有效的正则表达式,更少回溯。
适用于任何长度的输入:
!/(.).*?\1/.test(number)
示例:
!/(.).*?\1/.test(1234567890) // true
!/(.).*?\1/.test(1234567490) // false - note that it also works for repeated chars which are not adjacent.
答案 3 :(得分:0)
lancemanfv正则表达式参考https://stackoverflow.com/a/12870549/1366360是一个很棒的,但建议的正则表达式略有偏差。
而是尝试
^(?:([0-9])(?!.*\1)){10}$
这将匹配任何以10位数字开头和结尾的字符串。
如果你想检查(并提取)一个较长的字符串是否包含10位数字,每个数字不同,请使用此
((?:([0-9])(?!.*\2)){10})*
然后,您可以使用带编号的引用来提取匹配的数字
答案 4 :(得分:0)
每次都有效(我看到这个问题) -
修订以在(?! \10 )
断言之前定义Grp 10。 \ 1- \ 9始终被视为backrefs(> \ 10,父母必须在引用之前)。
所以他们也一样。
注意 - 这可以用于查找浮动(子串)10个百分比数字。不需要锚
Fyi - 使用Perl,无论组号是多少,都可以在定义组之前使用\g{#}
(或\k'name'
)语法。
# "(?:((?!\\1)1)|((?!\\2)2)|((?!\\3)3)|((?!\\4)4)|((?!\\5)5)|((?!\\6)6)|((?!\\7)7)|((?!\\8)8)|((?!\\9)9)|((?!\\10)0)){10}"
(?:
( # (1)
(?! \1 )
1
)
| ( # (2)
(?! \2 )
2
)
| ( # (3)
(?! \3 )
3
)
| ( # (4)
(?! \4 )
4
)
| ( # (5)
(?! \5 )
5
)
| ( # (6)
(?! \6 )
6
)
| ( # (7)
(?! \7 )
7
)
| ( # (8)
(?! \8 )
8
)
| ( # (9)
(?! \9 )
9
)
| ( # (10)
(?! \10 )
0
)
){10}