正则表达式查找具有唯一数字的数字

时间:2013-11-25 23:30:13

标签: java regex

我想找到没有重复数字的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}

这可以用正则表达式完成还是有更好的方法来实现这个目标?

5 个答案:

答案 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而不是忽略它

来源和解释:https://stackoverflow.com/a/12870549/1366360

答案 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.

Demo
- 检查重复的数字
- 与您想要的相反,因为rubular不允许!

答案 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}