用于验证复杂用户名的正则表达式

时间:2014-09-04 12:34:08

标签: regex

所以,条件是:

  1. 至少1个字符,最多20个字符
  2. 以[a-zA-Z]
  3. 开头
  4. 包含[a-zA-Z0-9 .-]
  5. 以[a-zA-Z0-9]
  6. 结束

    我的表达是:

        ^(?=[a-zA-Z])+[a-zA-Z0-9.-]*[a-zA-Z0-9]{1,20}$
    

    很好用。但是,它与用户名的长度无法正常工作。我可以输入一个三十个字符的用户名,但仍然可以找到匹配项。怎么了?

6 个答案:

答案 0 :(得分:2)

当想要针对多个规则验证字符串时,我倾向于发现复杂的正则表达式是一个糟糕的选择。它们会导致无法读取的代码难​​以维护。

如何(在伪代码中)

.length >= 1 && .length <= 20
&& /^[a-z0-9.-]+$/i
&& /^[a-z]/i
&& /[a-z0-9]$/i

即。检查长度,然后检查法定字符的有效性,然后检查开始和结束字符,完全按照问题文本中的描述。

还可以组合前两行,以便您只使用正则表达式:

   /^[a-z0-9.-]{1,20}$/i
&& /^[a-z]/i
&& /[a-z0-9]$/i

如果这比单行正则表达式慢,我会感到惊讶,但它肯定更具可读性。

答案 1 :(得分:2)

如果它仅包含[a-zA-Z0-9.-],则以[a-zA-Z]开头,以[a-zA-Z0-9]结尾,它不会以[-0-9.]开头且不会以[.-]结尾^(?![-0-9.])[a-zA-Z0-9.-]{1,20}(?<![.-])$

{{1}}

注意:仅适用于支持否定lookbehind的正则表达式。

Test at regex101

答案 2 :(得分:0)

您可以使用以下正则表达式

^(?=.{1,20}$)[a-zA-Z][a-zA-Z0-9.-]*[a-zA-Z0-9]$

DEMO

答案 3 :(得分:0)

试试这个:

^[a-zA-Z]$|^(?=.{2,20}$)[a-zA-Z][a-zA-Z0-9.-]*[a-zA-Z0-9]$

答案 4 :(得分:0)

以下是一个相当简单的解决方案:

^[a-zA-Z]$|^[a-zA-Z]{1}[a-zA-Z0-9.-]{0,18}[a-zA-Z0-9]{1}$

细分:

  • 要么:组中的单个字符[a-zA-Z]
  • 或者:组[a-zA-Z]中只有一个字符,组[a-zA-Z0-9.-]中最多18个字符,最后是组中的1个字符[a-zA-Z0- 9]。

正确匹配以下内容:

Valid
Valid.UserName
Valid1-1UserName
0-Invalid
Invalid.
Invalid-ThisIsTooLong
V

答案 5 :(得分:0)

如果字符串不以[a-zA-Z]开头,则正则表达式将失败。其余的更容易理解。

^(?=[a-zA-Z])[a-zA-Z0-9.-]{0,19}[a-zA-Z0-9]$

DEMO