据我所知{}
花括号用于限制正则表达式中的字符,如{3,12}
,将匹配3到12之间的字符长度。
我正在尝试验证可能包含句点.
或_
的用户名,其中任何一个,但不是两个,并不重要。为此,正则表达式工作得非常好。
(^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$)
但我还需要将字符串长度限制在3到12之间,我曾尝试将{3,12}
放在正则表达式中,但这并不起作用。
((^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$)){3,12}
答案 0 :(得分:3)
正如hwnd
建议的那样,一个更简单的解决方案是:
^(?=.{3,12}$)[a-z0-9]+(?:[._][a-z0-9]+)?$
旧解决方案相当复杂和复杂,留待参考,但请使用上面的解决方案。
^(?!(?:.{13,}|.{1,2})$)(?:([a-z0-9]+)|([a-z0-9]*[\.\_][a-z0-9]*))$
您可以为此添加前瞻。
答案 1 :(得分:0)
我会分三步完成。
在 Perl :
if ( ( ( $name =~ /_/ ) && ( $name =~ /\./ ) ) ||
( length($name) < 3 ) ||
( length($name) > 12 ) )
{
# Handle invalid username
}
如果您想确保用户名只包含一个点或下划线,您可以计算它们。再次,在Perl中:
my $dcnt = $name =~ tr /././;
my $ucnt = $name =~ tr /_/_/;
if ( ( $dcnt > 0 && $ucnt > 0 ) ||
( $dcnt > 1 ) ||
( $ucnt > 1 ) ||
( length($name) < 3 ) ||
( length($name) > 12 ) )
{
# Handle invalid username
}
为什么一个怪物正则表达式不能同时执行所有操作?好吧,为了可维护性。如果您或同事在一年内查看此代码,当需求发生变化时,此方法可以更轻松地更新代码。
另请注意{3,12}
对长度没有任何说明。它允许先前的模式匹配三到十二次。