用“。-_”分隔的单词的正则表达式,包括至少一个字母

时间:2013-02-12 11:26:45

标签: regex

这用于验证我系统上的用户名。

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

一个例子是

无效:

123.as-as123
123.AS-aS123

有效:

a123.as-as123
A123.AS-aS123

2 个答案:

答案 0 :(得分: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

然而,这是不太理想的,因为使[.\-_]可选使其在尝试匹配的方式上具有太大的灵活性。它可能必须在失败的模式上运行大量案例。

答案 1 :(得分: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

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