正则表达式,不重复数字

时间:2017-02-17 15:38:53

标签: regex plsql

你能帮我找出如何构建一些正则表达式来检测有效的13位数字序列

第一种情况:

1111111111111 -invalid
2222222222222 -invalid
333.....      -invalid

和其他数字一样,对于这种情况我做了这个正则表达式:

(^0+$)|(^1+$)|(^2+$)|(^3+$)|(^4+$)|(^5+$)|(^6+$)|(^7+$)|(^8+$)|(^9+$)

但我想简化这个正则表达式,如果有更短的方法来获得此验证。

第二种情况:

9875978545111  - valid: only 3 1's  
11118578954547 - valid: only 4 1's
85781111954547 - valid: only 4 1's
9875978111111  - invalid: 6 1's
1111119875978  - invalid: 6 1's
9871111115978  - invalid: 6 1's

如果有一系列至少重复6次的数字必须无效, 像最后一种情况,如果有办法缩短

我有这个正则表达式:([0-9]+1{6,}+)|(^1{6,}+[0-9]+)

案例3:

1212121212121
0101010101010
1231231231231

这些模式必须无效。

我不知道如何写这个正则表达式。

4 个答案:

答案 0 :(得分:2)

由于没有接缝支持预测,因此您可以使用此正则表达式(\d)\1{5,}并取消匹配。

答案 1 :(得分:2)

案例1 - 13相同数​​字:

(\d)\1{12}

案例2 - 超过5个相同的数字(你必须否定结果):

(\d)\1{5}

案例3 - TBA

答案 2 :(得分:2)

案例一和二:重复数字。这捕获了该数字的数字和重复。括号中的数字定义了您想要匹配的最小长度。

$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('TestBundle:TestUser')->findOneBy(['email' => $email]);

案例三:匹配重复序列。假设您仍在使用13位数字,则最长的可重复序列将具有6位数字。这匹配长度为2-6的重复序列。

([0-9])\1{13}
([0-9])\1{6}

所有情况都需要否定(正匹配意味着无效序列)。

答案 3 :(得分:1)

第一种情况

对于13个重复数字,您可以使用^(\d)\1{12}$来匹配具有有效序列的行。因此,只需接受正则表达式匹配任何内容的行。示例的实时链接:https://regex101.com/r/4zi3ZZ/2

第二种情况

如果超过5位数,您可以使用(\d)\1{5}来匹配无效序列的行。因此,只需接受正则表达式不匹配的行。示例的实时链接:https://regex101.com/r/vhoBCq/1

第三种情况

对于模式搜索,您无法使用 regex 执行此操作,因为 regex 用于搜索您知道它们存在的模式。它不能用于提取模式并研究它提取的模式的字符串。 正则表达式是众多Formal Languages之一。由于它是有限的,它不能做所有的事情。但是,你无法用 regex 做的一切,你可以通过编程来完成。

因此,您需要编写一个用于模式搜索的程序。一旦知道模式是什么,就可以使用:^(pattern)\1+$来匹配有效序列的行。因此,只需接受正则表达式匹配任何内容的行。示例^(123)\1+$ https://regex101.com/r/TCS46x/3

的实时链接
相关问题