如何使用正则表达式

时间:2015-05-30 16:07:10

标签: regex

据我所知{}花括号用于限制正则表达式中的字符,如{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}

参见示例:https://regex101.com/r/kN3aO1/1

2 个答案:

答案 0 :(得分:3)

正如hwnd建议的那样,一个更简单的解决方案是:

^(?=.{3,12}$)[a-z0-9]+(?:[._][a-z0-9]+)?$

旧解决方案相当复杂和复杂,留待参考,但请使用上面的解决方案。

^(?!(?:.{13,}|.{1,2})$)(?:([a-z0-9]+)|([a-z0-9]*[\.\_][a-z0-9]*))$

您可以为此添加前瞻。

Demo on regex101

答案 1 :(得分:0)

我会分三步完成。

  1. 检查字符串是否有任何' /'在它。
  2. 检查字符串是否有任何' _'在它。
  3. 检查字符串长度是否在3到12之间。
  4. 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}对长度没有任何说明。它允许先前的模式匹配三到十二次。