交替数字的正则表达式

3

我正在尝试编写一个用于匹配由9个固定数字组成的电话号码的正则表达式模式。

我想要识别那些由两个数字交替出现四次的号码,例如5XYXYXYXY

我使用了以下模式:

number = 561616161

我尝试了下面的模式,但是它不准确。
^5(\d)(?=\d\1).+

有人能指出我做错了什么吗?


也许我在这里走错了方向,但如果你想匹配5后面跟着4个相同的数字对,我会使用^5(\d\d)\1{3}$ - bobble bubble
3个回答

5
我会使用:
^(?=\d{9}$)\d*(\d)(\d)(?:\1\2){3}\d*$

演示

以下是该模式的解释:

  • ^ 匹配数字的起始位置
  • (?=\d{9}$) 断言恰好有9个数字
  • \d* 匹配可选的前导数字
  • (\d) 捕获\1中的一个数字
  • (\d) 捕获\2中的另一个数字
  • (?:\1\2){3} 再次匹配XY组合3次
  • \d* 匹配更多的可选数字
  • $ 匹配数字的结尾位置

4

如果你想重复4次2个相同的配对并匹配9个数字:

^(?=\d{9}$)\d*(\d\d)\1{3}\d*$

解释

  • ^ 字符串开头
  • (?=\d{9}$) 正向先行断言,断言字符串末尾有九个数字
  • \d* 匹配可选数字
  • (\d\d)\1{3} 捕获组1,匹配两个数字并重复捕获组1中的内容三次
  • \d* 匹配可选数字
  • $ 字符串结尾

正则表达式演示

如果你想匹配一个重复四次的两位不同数字的模式:

^(?=\d{9}$)\d*((\d)(?!\2)\d)\1{3}\d*$

解释

  • ^ 匹配字符串开头
  • (?=\d{9}$) 正向先行断言,匹配断言后面的9个数字直到字符串结尾
  • \d* 匹配可选数字
  • ( 捕获第一组
    • (\d) 捕获第二组,匹配一个数字
    • (?!\2)\d 负向先行断言,断言捕获的第二组字符不与当前字符相同。如果相同,则匹配一个数字
  • ) 关闭第一组
  • \1{3} 重复捕获的第一组内容3次
  • \d* 匹配可选数字
  • $ 匹配字符串结尾

正则表达式演示


1
我忘记了需要9位数字,你的回答让我意识到+1。 - Tim Biegeleisen
我正在写答案,但注意到你的回答。我想出了 ^(?=\d{9}$)\d?((\d)(?!\2)\d)(?:\d?\1){3}\d?$ 这个正则表达式,它是为了允许随机数字出现在任何地方而做了一些小改动,因为捕获的数字不必按顺序排列(4次)。无论如何,这就是我的理解。 - JvdV
@TimBiegeleisen 没问题,祝你好运 :-) - The fourth bird
@JvdV 那也很聪明,你可以发布那个,这样这个主题就覆盖了所有可能性 :-) - The fourth bird
1
@Thefourthbird 其他倒置的可能性匹配第一种第二种变体,以便也包含那些提到的内容 :) 祝你有一个愉快的星期天,第四只鸟! - bobble bubble

2
  1. My first guess from OP's self tried regex ^5(\d)(?=\d\1).+ without any own additions was a regex is needed to verify numbers starting with 5 and followed by 4 pairs of same two digits.

    ^5(\d\d)\1{3}$
    

    Demo at regex101

  2. The same idea with the "added guess" to disallow all same digits like e.g. 511111111

    ^5((\d)(?!\2)\d)\1{3}$
    

    Demo at regex101

  3. Guessing further that 5 is a variable value and assuming if one variable at start/end with the idea of taking out invalid values early - already having seen the other nice provided answers.

    ^(?=\d?(\d\d)\1{3})\d{9}$
    

    Demo at regex101

  4. Solution 3 with solution 2's assumption of two different digits in first pairing.

    ^(?=\d?((\d)(?!\2)\d)\1{3})\d{9}$
    

    Demo at regex101

方案3和方案4是在@4thBird的出色回答的基础上,按不同顺序进行的最明显的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接