用逗号分隔的正则表达式电话号码

时间:2017-02-03 07:16:51

标签: regex validation

我需要一个正则表达式来验证该字段。这是一个电话号码字段,数字由9个字符组成,数字将用逗号分隔。

示例:

123456789,123456789,123456789
123456789
123456789,123456789

我写道:

~^(([0-9]{9,9},)+|([0-9]{9,9})+)$~i

但验证仅传递带逗号的数字。

示例:

123456789,123456789,
123456789,

你能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

您需要将*量词设置为第一个9位数组:

~^(?:[0-9]{9},)*[0-9]{9}$~
               ^ 

请参阅regex demo。不需要~i不区分大小写的修饰符,模式中没有字母。此外,{9,9} = {9}

相同的模式可以写成

~^[0-9]{9}(?:,[0-9]{9})*$~

请参阅another demo

<强>详情:

  • ^ - 字符串开头
  • (?:[0-9]{9},)* - 0+序列:
    • [0-9]{9} - 9位数
    • , - 逗号
  • [0-9]{9} - 9位数
  • $ - 字符串结尾(可以替换为\z以匹配字符串的结尾)。

编辑:由于您只想匹配仅包含唯一数字的逗号分隔的9位数块,因此可以为其编写正则表达式,但不建议使用它。最好是使用您的编程语言。

正则表达式看起来像(详细版本):

^                      # start of string
 (                     # Group 1 start
  (\d)                 # Digit 1 captured into Group 2
  (?!\2)(\d)           # Digit 2 not equal to the first one
  (?!\2|\3)(\d)        # etc.
  (?!\2|\3|\4)(\d)
  (?!\2|\3|\4|\5)(\d)
  (?!\2|\3|\4|\5|\6)(\d)
  (?!\2|\3|\4|\5|\6|\7)(\d)
  (?!\2|\3|\4|\5|\6|\7|\8)(\d)
  (?!\2|\3|\4|\5|\6|\7|\8|\9)(\d)
 )
 (?:,(?1))*        # 0+ sequences of , and the Group 1 pattern
$                  # End of string

请参阅regex demo。一个one-liner

^((\d)(?!\2)(\d)(?!\2|\3)(\d)(?!\2|\3|\4)(\d)(?!\2|\3|\4|\5)(\d)(?!\2|\3|\4|\5|\6)(\d)(?!\2|\3|\4|\5|\6|\7)(\d)(?!\2|\3|\4|\5|\6|\7|\8)(\d)(?!\2|\3|\4|\5|\6|\7|\8|\9)(\d))(?:,(?1))*$

在PHP中,您可以使用

if (count( array_unique( str_split( $s))) == strlen($s)) {
    echo "Unique";
} else {
    echo "Not unique";
} 

答案 1 :(得分:0)

我不认为你的正则表达式必须非常复杂:

^\d{9}(,\d{9})*,?
  • 它将匹配至少一个由9位数组成的数字块。
  • 如果用逗号分隔,则可能会跟随其他9位数字块。
  • 整个表达式可以用逗号结尾。

答案 2 :(得分:0)

只需将加号(+)移到较大的组

的末尾即可
^(([0-9]{9,9},)|([0-9]{9,9}))+$