使用grep检查用户名

时间:2016-09-09 08:51:29

标签: php regex grep username

我搜索grep命令来检查用户名,如: -

mi.ma
ab-bc
ab.bc-ad
ab_de
mima

不允许应该:

..mima
mima..
mia--bc
mia---ad
ab___de
__ab
ab__

允许应为a-z, 0-9, -, ., _但不能加倍-, ., _,这也不在前面或后面。它必须分钟。有3个字符。

2 个答案:

答案 0 :(得分:2)

下面:

^[a-z0-9]+(?:[._-]?[a-z0-9]+)*$

Demo

说明:

  • 第一个[a-z0-9]+确保用户名称STARTS带有(小写)字母或数字。
  • [._-]?允许存在一个(或无)".""_""-"字符。
  • 最终[a-z0-9]+确保用户名ENDS带有(小写)字母或数字。
  • (...)*中包含第二个组可以在用户名中间添加多个".""_""-"个字符(只要它们用字母分隔即可/数字),例如"ab.bc-ad"

修改

我刚刚注意到你匹配的最终条件:

  

它必须分钟。有3个字符。

将此作为正则表达式的一部分添加的最简单方法是使用前瞻 - 即:

^(?=.{3,})[a-z0-9]+(?:[._-]?[a-z0-9]+)*$

这是一个带有其他测试字符串的updated demo

<强> EDIT2:

以上内容对PHP完全有效。但是,如果有人在阅读此内容时实际上是在使用grep寻找答案(即与PHP无关...)

首先请注意,您可以使用-x修饰符来匹配精确字符串,因此请取消^$锚点。然后,您有两个选项可以完成这项工作:

  1. 将上述代码与grep -P或等效pcregrep一起使用,因为标准grep工具不支持前瞻:

    pcregrep -x "(?=.{3,})[a-z0-9]+([._-]?[a-z0-9]+)*" <filename>
    
  2. 使用grep -E或等效egrep作为特殊字符支持;通过第二个grep输出输出以满足“min 3 chars”条件:

    egrep -x "[a-z0-9]+([._-]?[a-z0-9]+)*" <filename> | grep ...
    

答案 1 :(得分:0)

@TomLord回答是正确的。

我独立地得到完全相同的答案(一分钟后:-(),但是对于PHP(因为你添加了php标签...),所以我也写了......:

preg_match('/^[a-z0-9]+(?:[._-]?[a-z0-9]+)*$/', $name);