-2

这是为了验证我系统上的用户名。

每个用户名都可以包含这些符号“.-_”,但由上述符号分隔的单词不能只是数字。

一个例子是

无效的:

123.as-as123
123.AS-aS123

有效的:

a123.as-as123
A123.AS-aS123
4

2 回答 2

2

如果我正确理解您的要求,我相信这将起作用:

/^(?:[a-z0-9]*[a-z][a-z0-9]*[.\-_])*[a-z0-9]*[a-z][a-z0-9]*$/i

它匹配零组或多组以 、 或 结尾并至少需要一个字母的字母./-数字_。然后它匹配最后一组字母/数字,至少需要一个字母。

它不区分大小写(这就是i末尾的作用),因此它也将匹配大写。(这种语法至少在 Perl 和 PHP 中有效。在其他语言中,您可能必须以稍微不同的方式应用此选项,但始终可以使用不区分大小写的方法)。

有人可能会想像这样缩短它:

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

但是,这不太理想,因为将[.\-_]其设为可选项会在尝试匹配的方式上提供了太多的灵活性。它可能必须在失败的模式上运行大量案例。

于 2013-02-12T11:35:02.473 回答
0

您可以使用这 4 个正则表达式进行检查。

^([0-9]*?)[\.\-\_]         // Check if number is present between start and symbols
[\.\-\_]([0-9]*?)[\.\-\_]  // Check if number is present between these symbols
[\.\-\_]([0-9]*)$          // Check if number is present between these symbols and eol
^([0-9]+)$                 // Check only if number is present

如果其中任何一个的输出是 ne '',则打印无效,否则有效。

于 2013-02-12T11:56:29.983 回答