Pandigital Regex?

Bai*_* Li 5 regex

什么是正则表达式验证字符串是否为pandigital(包含从1到9的所有数字一次)?

例如:

123456789
891364572
Run Code Online (Sandbox Code Playgroud)

但不是:

11234556789
25896471
Run Code Online (Sandbox Code Playgroud)

我知道如何在没有正则表达式的情况下执行此操作,但我无法为此形成正则表达式.

谢谢.

这不是功课.

ram*_*ion 15

简短而甜蜜,使用否定前瞻:

/^(?!.*([1-9]).*\1)[1-9]{9}$/
Run Code Online (Sandbox Code Playgroud)
  • [1-9] 是非零数字的字符类 - 相当于 [123456789]
  • .* 匹配任何长度的任何字符串.
  • .*([1-9]).*\1.* 匹配任何包含至少两次相同非零数字的字符串
    • 非零数字匹配并捕获 ([1-9])
    • 重复该非零数字与第一个捕获的匹配\1反向引用相匹配.
    • .*匹配之前的任意填充,以及非零数字与其重复之间的匹配.
  • (?!<pattern>)匹配包含的模式匹配的任何位置.这是一个负向前瞻,因为它只匹配字符串中的一个位置,并且不消耗它中的任何一个 - 只是向前看以将其与包含的模式进行比较.
  • [1-9]{9} 匹配九个nonzeo数字.
    • <pattern>{9} 表示匹配前面的模式9次.
  • ^<pattern>$ 匹配与包含的模式完全匹配的任何字符串(而不是包含与模式匹配的子字符串)
    • ^ 匹配字符串开头的位置或行的开头
    • $ 匹配字符串末尾的位置或行的结尾

如此组合,我们检查以确保它不重复任何数字,然后我们检查它只是数字.因为它长9位,没有重复,所以必须只显示一次.这就是工作中的鸽子原则!

特定正则表达式引擎的语法可能会有所不同.以上是PCRE(Perl,Ruby和许多其他语言支持).Posix正则表达式的语法略有不同.并非所有引擎都支持负向前瞻,但大多数都支持反向引用.两者都不是形式理论正则表达式的定义的一部分,但是非常方便.