正则表达式限制最后8位不重复

时间:2014-06-23 00:37:39

标签: regex

我需要一个正则表达式来限制移动电话上的重复次数不超过7次。 初始数字必须是0,第二个数字可以是23478。 最后8位数不得重复(它们不应该是相同的数字)。 我有以下正则表达式检查空格,并确保其余数字仅为0-9的数字:

[\\s]*[0][\\s]*[23478][0-9\\s]*

我需要帮助来限制不重复的最后8位数字(它们不应该相同)。

假设我输入“0422222222”

我需要限制最后8位数字不相同。 0 - 首先 2,3,4,7,8 - 排在第二位 地点3 - 10,即最后八位数 - 不是相同的数字。 它们可以是0-9之间的任何数字,它们可以从3到10的可用8个位置重复7次。 他们不能重复8次。这不是3个地方的所有8个数字都应该由一个数字占用。我希望这次我很清楚。等待你的回复。

3 个答案:

答案 0 :(得分:1)

如果您的意思是数字不能紧跟相同的数字,您可以使用以下内容:

^0[2-47-8](?:([0-9])(?!\1)){8}$

请参阅demo

选项2:允许空格

^0[ ]*[2-47-8][ ]*(?:[ ]*([0-9])(?![ ]*\1)){8}$

demo。请注意,[ ]空格周围不需要括号,但它更容易阅读。

选项3:仅排除重复8次的一位数

^0[ ]*[2-47-8][ ]*(?:[ ]*([0-9])(?!(?:[ ]*\1){7}))(?:[ ]*[0-9]){7}$

请参阅demo

选项2的说明

  • ^声称我们位于字符串的开头
  • 0[ ]*匹配零和可选空格
  • [2-47-8][ ]*匹配2,3,4,7或8以及可选空格
  • (?:[ ]*([0-9])匹配可选空格[ ]*,然后匹配一个数字([0-9])并将其捕获到第1组
  • 否定前瞻(?!(?:[ ]*\1){7}))断言下面的内容不是七次相同的数字(中间有可选空格)
  • (?:[ ]*[0-9]){7}匹配最后七位数字
  • $断言我们已到达字符串
  • 的末尾

选项3的说明

  • ^声称我们位于字符串的开头
  • 0[ ]*匹配零和可选空格
  • [2-47-8][ ]*匹配2,3,4,7或8以及可选空格
  • (?:[ ]*([0-9])(?![ ]*\1))匹配可选空格[ ]*,然后匹配一个数字([0-9])并将其捕获到第1组,只要否定前瞻(?![ ]*\1)能够断言那是什么follow不是可选空格和相同的数字,如反向引用\1
  • 所引用的
  • 并由{8}量词
  • 重复8次
  • $断言我们已到达字符串
  • 的末尾

<强>参考

答案 1 :(得分:1)

^0[23478][\s\d]*\s*(\d)\s*(?!\1)(\d)\s*(?!\1|\2)(\d)\s*(?!\1|\2|\3)(\d)\s*(?!\1|\2|\3|\4)(\d)\s*(?!\1|\2|\3|\4|\5)(\d)\s*(?!.*\1|\2|\3|\4|\5|\6)(\d)\s*(?!\1|\2|\3|\4|\5|\6|\7)(\d)$

Rubular demo

此表达式使用负前瞻来限制下一个数字是前一个数字之一。说明:

^                                 - start of line
0[23478]                          - 0 followed by '2' or '3' or '4' or '7' or '8'
[\s\d]*                           - digits or spaces before the last 8
                                    (if you only need leading two and last eight,
                                    i.e. total 10 digits, delete this bit)
\s*(\d)                           - first digit of eight
\s*(?!\1)(\d)                     - second digit of eight, different from first
\s*(?!\1|\2)(\d)                  - third digit of eight, different from first and second
etc.                              - etc
\s*(?!\1|\2|\3|\4|\5|\6|\7)(\d)   - last digit of eight, different from the first seven
$                                 - end of line

这适用于Ruby regexp实现,适用于大多数其他引擎;但是当你询问正则表达式时,指出你正在使用哪种实现,因为各种各样的东西可能不起作用(例如负面的lookbehind (?!...))。

编辑:语法brainfart。谢谢,ooga。

澄清后更新:

^0\s*[23478]\s*(\d)(?!(?:\s*\1){7})(?:\s*\d){7}$

说明:

^                 - start of line
0\s*[23478]       - '0' followed by '2' or '3' or '4' or '7' or '8'
                    (with optional spacing that I forgot the last time time)
\s*(\d)           - a digit (with optional spacing)
(?!(?:\s*\1){7})  - not followed by 7 of the same (with optional spacing)
(?:\s*\d){7}      - but followed nevertheless by 7 digits (with optional spacing)
$                 - end of line

答案 2 :(得分:0)

你可以使用这种模式
^0\s*[23478]\s*(\d)(?=.*(?!\s|\1|$))(?:\s*\d){7}$
Demo

  • ^0\s*[23478]\s*(\d)第一部分,轻松+捕获第三位数
  • (?=.*(?!\s|\1|$))展望未来。*看不到(\ s或\ 1&#34;第三位&#34;或$)即另一位数
  • (?:\s*\d){7}$吃剩下的可选空格和7位数字。