我需要一个正则表达式来验证该字段。这是一个电话号码字段,数字由9个字符组成,数字将用逗号分隔。
示例:
123456789,123456789,123456789
123456789
123456789,123456789
我写道:
~^(([0-9]{9,9},)+|([0-9]{9,9})+)$~i
但验证仅传递带逗号的数字。
示例:
123456789,123456789,
123456789,
你能帮我解决这个问题吗?
答案 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})*,?
答案 2 :(得分:0)
只需将加号(+)移到较大的组
的末尾即可^(([0-9]{9,9},)|([0-9]{9,9}))+$