我正在徒劳地写一个正则表达式来匹配有效的ssh连接字符串。
我真的只需要识别格式的字符串:
但是也可以匹配隐式主目录:
我到目前为止提出了这个正则表达式:
/^[:alnum:]+\@\:(\/[:alnum:]+)*$/
无效。
在我的大脑爆炸之前,任何建议都欢迎,我开始在线上发声:)
答案 0 :(得分: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进行长时间)。不幸的是,这使得我的正则表达式笨拙(见上文)而不是过度国际化。为此道歉。
答案 1 :(得分:0)
括号表达式位于自己的括号内。你匹配冒号,'a','l','m','n'或'u'中的任何一个。
就像Pax说的那样,你错过了主机名。但是括号表达式仍然是错误的。
答案 2 :(得分: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:]_.]*:(/[^/]*)*$)
答案 3 :(得分:0)
经过一些修改我正在使用:
/^\w+\@(\w|\.)+\:(\/\w+)*$/
似乎与我的测试用例相匹配,并说明了主机部分中的主机名,FQDN和IP地址。它还使冒号后面的路径可选,以允许隐式主目录。
感谢目前为止的帮助 - 在指出之前我没有发现主机名的缺失。
答案 4 :(得分:0)
好的,进一步修改为:
/^\w+\@(\w|\.)+\:(\/(\w|.)+)*$/
来解释。可能存在于文件名中。
答案 5 :(得分:0)
最后去:
/^\w+\@(\w|\.)+\:(\/(\w|.)+\/?)*$/
这也允许使用可选的尾部斜杠。
答案 6 :(得分:0)
对于 I 所需的内容,这些并没有做到;因为有些人已经破产或不够自由。例如,如果您有一个名为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
添加到主机正则表达式的两个首字母匹配部分。