所以,条件是:
我的表达是:
^(?=[a-zA-Z])+[a-zA-Z0-9.-]*[a-zA-Z0-9]{1,20}$
很好用。但是,它与用户名的长度无法正常工作。我可以输入一个三十个字符的用户名,但仍然可以找到匹配项。怎么了?
答案 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的正则表达式。
答案 2 :(得分:0)
答案 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}$
细分:
正确匹配以下内容:
Valid
Valid.UserName
Valid1-1UserName
0-Invalid
Invalid.
Invalid-ThisIsTooLong
V
答案 5 :(得分:0)