3

我徒劳地尝试编写一个正则表达式来匹配有效的 ssh 连接字符串。

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

  • 用户@主机名:/一些/路径

但最好也匹配一个隐式主目录:

  • 用户@主机名:

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

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

这不能按预期工作。

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

4

7 回答 7

2

您提供的正则表达式没有主机名部分。尝试:

/^[: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 。

此外, :alnum: 可能不会为您的部分提供所需的范围。你可以有 ”。” 主机名中的字符,并且可能还需要允许使用“_”字符。我很少看到用户名或主机名以非字母开头。

顺便说一句,我尽量避免使用增强的正则表达式,因为它们不能在所有正则表达式引擎上运行(我已经使用 UNIX很长时间了)。不幸的是,这使我的正则表达式变得笨拙(见上文)并且没有过度国际化。对此表示歉意。

于 2008-12-10T11:26:12.127 回答
0

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

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

于 2008-12-10T11:24:38.963 回答
0

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:]_.]*:(/[^/]*)*$)

于 2008-12-10T11:28:02.967 回答
0

最后走:

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

这也允许一个可选的尾部斜杠。

于 2008-12-10T14:48:54.043 回答
0

经过一些修改后,我正在使用:

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

这似乎与我的测试用例和主机部分中的主机名、FQDN 和 IP 地址相匹配。它还使冒号后的路径可选,以允许隐式主目录。

感谢您到目前为止的帮助 - 在被指出之前,我没有发现缺少主机名。

于 2008-12-10T11:44:50.873 回答
0

好的,进一步修改为:

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

占。可能存在于文件名中。

于 2008-12-10T12:06:02.203 回答
0

这些并不能满足的需要。因为有些破产或不够自由。例如,如果您有一个名为stackoverflow.com没有点的文件夹会破坏它。实现的\w含义不一致,所以我不建议使用它,特别是因为我们非常清楚我们需要什么字符。

以下是构造正则表达式的 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主机正则表达式的两个首字母匹配部分。

于 2014-09-27T19:56:53.627 回答