我需要一个正则表达式来限制移动电话上的重复次数不超过7次。
初始数字必须是0
,第二个数字可以是2
,3
,4
,7
或8
。
最后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个数字都应该由一个数字占用。我希望这次我很清楚。等待你的回复。
答案 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}
量词$
断言我们已到达字符串<强>参考强>
答案 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)$
此表达式使用负前瞻来限制下一个数字是前一个数字之一。说明:
^ - 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位数字。