代码之家  ›  专栏  ›  技术社区  ›  Sam

匹配ssh连接字符串的正则表达式

  •  2
  • Sam  · 技术社区  · 16 年前

    我试图编写一个正则表达式来匹配有效的ssh连接字符串,但没有成功。

    我只需要识别格式的字符串:

    • user@hostname:/some/path

    不过,最好也匹配一个隐式主目录:

    • user@主机名:

    到目前为止,我已经想出了这个正则表达式:

    /^[:alnum:]+\@\:(\/[:alnum:]+)*$/
    

    但并没有达到预期的效果。

    任何建议都欢迎在我的大脑爆炸之前,我开始用线声说话:)

    7 回复  |  直到 10 年前
        1
  •  2
  •   paxdiablo    16 年前

    您提供的regex没有hostname部分。尝试:

    /^[:alnum:]+\@[:alnum:\.]\:(\/[:alnum:]+)*$/
    

    /^[A-Za-z][A-Za-z0-9_]*\@[A-Za-z][A-Za-z0-9_\.]*\:(\/[A-Za-z][A-Za-z0-9_]*)*$/
    

    因为我不信任没有双括号的阿纳姆。

    另外,:alnum:可能无法为您的节提供所需的范围。您的主机名中可以有“.”个字符,并且可能还需要允许有“.”个字符。我很少看到用户名或主机名以非字母开头。

    作为补充说明,我尽量避免使用增强的regex,因为它们并不运行在所有的regex引擎上(我一直在使用unix 长的 时间)不幸的是,这使得我的正则表达式笨拙(见上文),而不是过度国际化。为此道歉。

        2
  •  0
  •   Nietzche-jou    16 年前

    括号表达式放在自己的括号内。您正在匹配冒号、'a'、'l'、'm'、'n'或'u'中的任何一个。

    就像pax说的,你错过了主机名。但是括号表达式仍然是错误的。

        3
  •  0
  •   sa    16 年前

    在经过更多的修改之后,我正在使用:

    /^\w+\@(\w|\.)+\:(\/\w+)*$/
    

    它似乎与我的测试用例相匹配,并且在主机部分包含主机名、fqdns和ip地址。它还使冒号后面的路径成为可选,以允许隐式主目录。

    谢谢你到目前为止的帮助-我没有发现缺少主机名,直到它被指出。

        4
  •  0
  •   Kent Fredric    16 年前

    SGM在做什么,你在做什么

    /^[:alnum:]+\@\:(\/[:alnum:]+)*$/
    

    你应该去哪里

    /^[[:alnum:]]+\@\:(\/[[:alnum:]]+)*$/
    

    pax的答案也很实用,但如果没有合适的双括号,就无法工作。

    my $at  = q{@};
    my @res = (
        qr/^[:alnum:]+${at}[:alnum:]+:(\/[:alnum:]+)*$/,
        qr/^[[:alnum:]]+${at}[[:alnum:]]+:(\/[[:alnum:]]+)*$/,
        qr/^[a-z][[:alnum:]_]*${at}[a-z][[:alnum:]_.]*:(\/[^\/]*)*$/i,
    );
    
    my @u = qw{
      user@hostname:/some/path
      bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_
      9foo@9foo.org:/9foo/9foo
      baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually)
    };
    
    for my $str (@u) {
        for my $re (@res) {
            if ( $str =~ $re ) {
                print "$str =~ $re\n";
            }
            else {
                print "NOT $str =~ $re\n";
            }
        }
    }
    

    POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/^[:alnum:] <-- HERE +@[:alnum:]+:(/[:alnum:]+)*$/ at /tmp/egl.pl line 27.
    POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/^[:alnum:]+@[:alnum:] <-- HERE +:(/[:alnum:]+)*$/ at /tmp/egl.pl line 27.
    POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/^[:alnum:]+@[:alnum:]+:(/[:alnum:] <-- HERE +)*$/ at /tmp/egl.pl line 27.
    NOT user@hostname:/some/path =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
    user@hostname:/some/path =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
    user@hostname:/some/path =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)
    NOT bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_ =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
    NOT bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_ =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
    bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_ =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)
    NOT 9foo@9foo.org:/9foo/9foo =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
    NOT 9foo@9foo.org:/9foo/9foo =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
    NOT 9foo@9foo.org:/9foo/9foo =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)
    NOT baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually) =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
    NOT baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually) =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
    baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually) =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)
    

        5
  •  0
  •   sa    16 年前

    好的,进一步修改为:

    /^\w+\@(\w|\.)+\:(\/(\w|.)+)*$/
    

    来解释。可能存在于文件名中。

        6
  •  0
  •   sa    16 年前

    最后围棋:

    /^\w+\@(\w|\.)+\:(\/(\w|.)+\/?)*$/
    

    这也允许使用可选的尾随斜杠。

        7
  •  0
  •   Derrek Bertrand    10 年前

    这些并不是为了什么 需要;因为有些人破产了或者不够自由。例如,如果您有一个名为 stackoverflow.com 没有圆点会把它弄坏的。实现在以下方面不一致 \w 意思是,所以我不建议使用这个,特别是因为我们很清楚我们需要什么角色。

    下面是构造regex的bash示例:

    #should match 99.9% of SSH users
    user_regex='[a-zA-Z][a-zA-Z0-9_]+'
    #match domains
    host_regex='([a-zA-Z][a-zA-Z0-9\-]*\.)*[a-zA-Z][a-zA-Z0-9\-]*'
    #match paths starting with / and empty strings (which is valid for our use!)
    path_regex='(\/[A-Za-z0-9_\-\.]+)*\/?'
    #the complete regex
    master_regex="^$user_regex\@$host_regex\:$path_regex\$"
    

    如果需要的话,这提供了稍后检查部件的模块性。在匹配添加中启用IP地址 0-9 到主机regex的两个首字母匹配部分。