不重复数字的正则表达式

Posted

技术标签:

【中文标题】不重复数字的正则表达式【英文标题】:Regular expression without repeating numbers 【发布时间】:2017-02-17 15:38:53 【问题描述】:

你能帮我找出如何构建一些正则表达式来检测有效的 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]+16,+)|(^16,+[0-9]+)

案例3:

1212121212121
0101010101010
1231231231231

像论文这样的模式一定是无效的。

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

【问题讨论】:

我认为您应该给出确切的验证规则。因此,我们将帮助您为其构建一个好的正则表达式 类似this? 试试NOT REGEXP_LIKE(col, '([0-9]+)\15') 是什么让案例 3 有效或无效?不同位数的数量?重复序列?请详细说明。 12、10、123等重复的数字序列 【参考方案1】:

由于plsql 不支持前瞻,您可以使用此正则表达式(\d)\15, 并否定匹配。

【讨论】:

【参考方案2】:

第 1 - 13 个相同数字的情况:

(\d)\112

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

(\d)\15

案例 3 - 待定

【讨论】:

【参考方案3】:

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

([0-9])\113
([0-9])\16

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

([0-9]2,6)\1

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

【讨论】:

您的意思是:所有可能匹配的行都无效? 是的。如果我对问题的理解正确,则找到模式意味着该数字无效。【参考方案4】:

第一种情况

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


第二种情况

对于超过 5 位,您可以使用:(\d)\15,以匹配具有 invalid 序列的行。因此,只需接受正则表达式 不匹配 的行。示例的实时链接:https://regex101.com/r/vhoBCq/1


第三种情况

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

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

【讨论】:

以上是关于不重复数字的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

只接受数字(0-9)和无字符的正则表达式[重复]

如何使用正则表达式检查不应包含重复数字的手机号码

如何仅匹配两个点之间的数字,不包括使用正则表达式的点[重复]

只接受字符、数字和特殊字符的正则表达式,而不是 [重复]

正则表达式检查重复

10 位或 6 位数字的正则表达式不应以“/”开头和结尾,也可以是字符串中的单个单词 [重复]