正则表达式一点或一个下划线验证器

4
这是我的正则表达式。
^(([a-z0-9]+)\.([a-z0-9]+)){4,20}$|^(([a-z0-9]+)\_([a-z0-9]+)){4,20}$

这将是一个只有一个点、下划线或没有下划线和点的单词。我还希望这个表达式在4到20个字符之间(它将成为数据库中的用户名)。
这个正则表达式。
^(([a-z0-9]+)\.([a-z0-9]+))$

这一个。
^(([a-z0-9]+)\_([a-z0-9]+))$

成功运作,但我不知道如何限制字符串长度。:( 请帮忙。我将会在Zend框架的正则表达式验证器中使用它...
2个回答

8
^(?=[^\._]+[\._]?[^\._]+$)[\w\.]{4,20}$

解释:

^            - Start of string
(?=          - Followed by (not part of match)
  [^\._]+    - Anything but . and _
  [\._]?     - Optional . or _
  $          - End of string
)
[\w\.]{4,20} - 4-20 letters, digits, _ and .
$            - End of string
(?=[^\._]+[\._]?[^\._]+$) 确保字符串中不含有多于1个 ._ 符号。其余部分与字符串匹配。

我添加了一个解释。另请参阅:http://www.regular-expressions.info/lookaround.html - Kendall Frey
2
非常小的注意事项 - 在字符类中不需要转义句点。 - Mike Pelley
@Mike:已经注意到了。如果两者都可以选择,我更喜欢转义而不是不转义,以避免混淆。 - Kendall Frey
有人可能会说转义始终是一种选择,但我想我理解了你的观点。 - Mike Pelley
抱歉晚了,字符串不必包含点或下划线,字符串“foofoo”是有效的并且应该匹配。 - shampoo

2
你应该使用第二个验证器来验证长度,而不是在正则表达式中进行验证,这将提高代码的可读性。请使用 ^[a-z0-9]+[._][a-z0-9]+$ 作为你的正则表达式,并使用 Regex 验证器进行验证,使用 StringLength 验证器来检查长度。

^[a-z0-9]+([._]{0,1})[a-z0-9]+$ 可以是这样的,而且几乎完成了 :D - shampoo
提醒一下 - 这是那个正则表达式的简化版:^[a-z0-9]+[._]?[a-z0-9]+$(问号等同于{0,1},括号并非必需)。 - Mike Pelley

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