0

我正在使用以下正则表达式代码:

^[a-z0-9_-]{3,15}$^

我使用它来验证用户名,我希望它匹配字母数字字符-_和句点。

发生以下奇怪的事情:

它不符合这个:

bla.b

但它匹配这个:

bla.blabla

我怎样才能改变它,使它匹配两者?我仍然希望能够自由更改最小和最大字符。(顺便说一句。这个正则表达式可能有更多错误的地方。这是我偶然发现的)

更新:我应该提到我在 CakePHP 验证中使用它,这给了我一个错误:

^[a-z0-9_.-]{3,15}$

这是错误:

Warning (2): preg_match() [function.preg-match]: No ending delimiter '^' found
4

3 回答 3

8

你犯了一个小错误,忘了把 the^放在开头。选择不同的分隔符可能会使它更明显:

^[a-z0-9_-]{3,15}$^    // your non-working version
^                 ^

/^[a-z0-9_-]{3,15}$/  // using / as delimiters instead, setting the beginning
 ^

记住:

  • ^ - 标记主题的开始
  • $ - 标志着主题的结束

两者都是模式的一部分。定界符用于将模式与修饰符分开(您在这里不使用任何修饰符)。

\A或者,\Z如果有帮助,您也可以表示开头和结尾。

现在也匹配点,将其添加到您的角色类中:

/^[a-z0-9_.-]{3,15}$/
          ^
于 2012-12-25T20:51:43.330 回答
5
^[a-z0-9_-]{3,15}$^

应该:

^[a-z0-9_-]{3,15}$

^表示字符串的开头,并$表示字符串的结尾。

于 2012-12-25T20:51:41.363 回答
1

这应该这样做:

/^[a-z0-9_\.\-]{3,15}$/

如果您想匹配用户名,那么您可能不希望它以点开头或结尾。在这种情况下,您可以使用:

/^(?<!\.)[a-z0-9_\.\-]{3,15}(?!\.)$/

这就是该正则表达式的分解方式:

  1. ^表示“字符串的开头”
  2. (?<!\.)确保用户名不能以点开头
  3. [a-z0-9\._-]{3,15}表示 3 到 15 个字母数字字符、点、下划线和连字符
  4. (?!\.)确保用户名不能以点结尾
  5. $表示“字符串的结尾”

如果您允许大写字符,那么您可以稍微缩短正则表达式:

/^(?<!\.)[\w\.\-]{3,15}(?!\.)$/

\w简称[a-zA-Z0-9_],也叫字字

确保用户名不以点开头或结尾的另一种方法是使用三个连续[]的 ,如下所示:

/^[\w\-][\w\.\-]{1,13}[\w\-]$/

如果您需要匹配 Javascript 中的某些内容,我相信它不支持后向和前瞻,它会很有用。

于 2012-12-25T21:07:17.253 回答