什么是正则表达式验证字符串是否为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正则表达式的语法略有不同.并非所有引擎都支持负向前瞻,但大多数都支持反向引用.两者都不是形式理论正则表达式的定义的一部分,但是非常方便.