定义一个正则表达式,它两次匹配一个数字,一次匹配所有其他数字

阿敏

作为较大的正则表达式的一部分,我希望符合以下限制:

  1. 字符串有11位数字
  2. 所有数字都是数字
  3. 在前10位数字中,必须将一个数字[0-9](并且只有一个!)列出两次。

这意味着以下内容应匹配:

12345678914
12235879600

而这些不应:

12345678903 -> none of the numbers at digits 1 to 10 appears twice
14427823482 -> one number appears more than twice
72349121762 -> two numbers appear twice

我试图使用前瞻性,但是我要管理的是正则表达式计数某个数字,即:

(?!.*0\1{2})

那不能满足我的需求。使用regex甚至可以查询吗?

卡西米尔和希波吕特

您可以使用这种模式:

\A(?=\d{11}\z)(?:(\d)(?!\d*\1\d))*(\d)(?=\d*\2\d)(?:(\d)(?!\d*\3\d))+\d\z

在线演示

图案细节:

想法是将字符串描述为重复的数字,并用非重复的数字包围。

通过捕获组先行断言和后向引用可以轻松找到重复的数字
(\d)(?=\d*\1)

您可以使用相同的模式来确保数字没有重复,但是这次的前瞻性为负: (\d)(?!\d*\1)

要在重复搜索中不考虑最后一位数字(n°11位),您只需要在反向引用之后添加一位数字。(\d)(?=\d*\1\d) (通过这种方式,您可以确保在反向引用和字符串末尾之间至少有一个数字。)

注意,在当前上下文中,所谓的重复数字是指没有立即或稍后跟随相同数字的数字。(即,1234567891第一个1是重复数字,但最后一个1不再是重复数字,因为它后面没有另一个1

\A                       # begining of the string
(?=\d{11}\z)             # check the string length (if not needed, remove it)
(?:(\d)(?!\d*\1\d))*     # zero or more non duplicate digits
(\d)(?=\d*\2\d)          # one duplicate digit
(?:(\d)(?!\d*\3\d))+     # one or more non duplicate digits
\d                       # the ignored last digit
\z                       # end of the string

其他方式

这次,您使用先行模式在模式的开头检查重复项。一个前瞻以确保有一个重复的数字,一个否定前瞻以确保没有两个重复的数字:

\A(?=\d*(\d)(?=\d*\1\d))(?!\d*(\d)(?=\d*\2\d)\d*(\d)(?=\d*\3\d))\d{11}\z

图案细节:

\A
(?=                       # check if there is one duplicate digit
    \d*(\d)(?=\d*\1\d)
)
(?!                       # check if there are not two duplicate digits
    \d*(\d)(?=\d*\2\d)    # the first
    \d*(\d)(?=\d*\3\d)    # the second
)
\d{11}
\z

注意:但是,第一种方法似乎更有效。

编码方式

您可以使用数组方法轻松检查您的字符串是否符合要求:

> mydigs = "12345678913"
=> "12345678913"
> puts (mydigs.split(//).take 10).uniq.size == 9
true
=> nil

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Powershell正则表达式匹配一个没有其他数字的数字

正则表达式-带有2个不同字母的单词重复两次,然后重复一个数字6次

正则表达式匹配不跟一个点一个数字(“”)

正则表达式匹配一个或两个,但不是两次

如何匹配或替换正则表达式中一个语句出现两次的模式?

正则表达式连续两次匹配包含一个字符的单词

python正则表达式,只返回第一个数字匹配

正则表达式匹配一个数字不是

正则表达式匹配一个数字

如果第一个数字没有出现在末尾,则正则表达式匹配第一个数字

正则表达式匹配一个数字,然后跟一个符号重复多次?

如何匹配行的正则表达式只有一个数字,反之亦然?

正则表达式匹配一个数字中的 7 个相同数字,无论位置如何

正则表达式匹配所有字母数字字符和零或一个'@'符号

正则表达式 - 匹配一个字符后的所有数字

正则表达式用于在两个数字之间用一个可选的逗号匹配X个数字?

正则表达式可以任意组合一次匹配一个字符

python 3正则表达式:一次匹配一个字符

使用多个正则表达式:按显示顺序一次打印一个匹配项

PHP正则表达式匹配一个词,但不匹配其他

正则表达式匹配一个数字但不在另一个数字内

正则表达式精确匹配5个数字和一个可选空格

有一个正则表达式匹配一个组或其他组字符,两边都相同

正则表达式:匹配给定整数中的一个数字的三元组

正则表达式在最后修复一个(所有匹配项或不匹配)

正则表达式匹配两个特定字符并获取第一个数字,然后是这些字符

正则表达式匹配带有特定前缀的单词后从I到X的一个或多个数字或罗马数字

正则表达式以确保范围内的每个数字都匹配一次

Javascript正则表达式至少匹配一个字母或数字?