正则表达式匹配字母数字,可能只在中间划线

时间:2014-09-22 18:11:24

标签: php regex

我设法做到这一点:

^[a-zA-Z0-9]+(?:--?[a-zA-Z0-9]+)*$

但上面的表达并没有限制我需要它的长度。我需要模式只匹配5-6个字符。所以,这就是应该如何解决的问题:

safety        (valid)
safet-        (invalid)
s-a-fe        (valid)
-safet        (invalid)
s7-45         (valid)
s--fs         (invalid)

连续的连字符无效。前导和尾随连字符无效。总长度(包括任何连字符)应为5-6个字符。我尝试用范围(+)替换{5,6} s,但没有运气。我感谢任何帮助。


我试过的另一条路线是:

^[A-Z0-9][A-Z0-9-]{3,4}[A-Z0-9]$i

这似乎很好而且效率很高,但它允许连续的连字符。

2 个答案:

答案 0 :(得分:3)

首先使用前瞻来指定允许的字符数。

^(?=.{5,6}$)[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$

DEMO

答案 1 :(得分:1)

(?!^-)(?!.*?-$)(?!.*?--)^[a-zA-Z0-9-]{5,6}$

试试这个。看看演示。

http://regex101.com/r/kM7rT8/15