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

阿敏

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

  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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

在正则表达式中,匹配一个数字的实例,但前提是不带任何其他数字

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何只匹配正则表达式中的第一个数字

来自分类Dev

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

来自分类Dev

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

来自分类Dev

正则表达式仅匹配一次

来自分类Dev

使正则表达式匹配一次

来自分类Dev

正则表达式仅匹配一次

来自分类Dev

正则表达式匹配所有内容,直到最后一次出现/

来自分类Dev

正则表达式匹配所有内容,直到最后一次出现/

来自分类Dev

正则表达式 - 在第一次匹配之前删除所有内容

来自分类Dev

密码验证,一次一个正则表达式模式

来自分类Dev

正则表达式:一个字符的最后一次出现与另一个字符的第一次出现之间的匹配

来自分类Dev

正则表达式例外-如果数字是下一个符号,则不匹配所有内容

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

更改正则表达式模式以一次将字符串匹配一个字符

来自分类Dev

更改正则表达式模式以一次将字符串匹配一个字符

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用正则表达式在最后一次匹配出现之前提取数字

来自分类Dev

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

来自分类Dev

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

来自分类Dev

正则表达式从具有至少一个数字的文本中提取所有单词

来自分类Dev

在一次通过的grep多个表达式,输出匹配到在单独的文件中的每一个表达

来自分类Dev

正则表达式可匹配第一个逗号和第一个数字之前的逗号之间的文本

Related 相关文章

  1. 1

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

  2. 2

    在正则表达式中,匹配一个数字的实例,但前提是不带任何其他数字

  3. 3

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

  4. 4

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

  5. 5

    如何只匹配正则表达式中的第一个数字

  6. 6

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

  7. 7

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

  8. 8

    正则表达式仅匹配一次

  9. 9

    使正则表达式匹配一次

  10. 10

    正则表达式仅匹配一次

  11. 11

    正则表达式匹配所有内容,直到最后一次出现/

  12. 12

    正则表达式匹配所有内容,直到最后一次出现/

  13. 13

    正则表达式 - 在第一次匹配之前删除所有内容

  14. 14

    密码验证,一次一个正则表达式模式

  15. 15

    正则表达式:一个字符的最后一次出现与另一个字符的第一次出现之间的匹配

  16. 16

    正则表达式例外-如果数字是下一个符号,则不匹配所有内容

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

    更改正则表达式模式以一次将字符串匹配一个字符

  21. 21

    更改正则表达式模式以一次将字符串匹配一个字符

  22. 22

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

  23. 23

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

  24. 24

    使用正则表达式在最后一次匹配出现之前提取数字

  25. 25

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

  26. 26

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

  27. 27

    正则表达式从具有至少一个数字的文本中提取所有单词

  28. 28

    在一次通过的grep多个表达式,输出匹配到在单独的文件中的每一个表达

  29. 29

    正则表达式可匹配第一个逗号和第一个数字之前的逗号之间的文本

热门标签

归档