Expressão regular para coincidir com uma seqüência de conexão ssh

votos
2

Eu estou tentando em vão escrever uma expressão regular para coincidir com seqüências de conexão ssh válidos.

Eu realmente só precisa reconhecer cordas do formato:

  • user @ hostname: / some / path

mas seria bom também corresponder a um diretório home implícita:

  • user @ hostname:

Eu so-far chegar a esse regex:

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

que não funciona como pretendido.

Todas as sugestões boas-vindas antes de meus explode cerebrais e eu começar a falar no ruído na linha :)

Publicado 10/12/2008 em 12:14
fonte usuário
Em outras línguas...                            


7 respostas

votos
2

Seu regex fornecido não tem a seção hostname. Experimentar:

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

ou

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

desde que eu não confio alnum sem colchetes duplos.

Além disso,: alnum: não pode dar-lhe o intervalo necessário para as suas seções. Você pode ter "." caracteres em seu nome de host e também pode precisar para permitir a "_" caracteres. E é raro que eu vi nomes de usuários ou nomes de host começar com um não-alfabético.

Assim como uma nota lateral, eu tento evitar as expressões regulares avançados, uma vez que não são executados em todos os motores de regex (eu tenho usado UNIX por um longo tempo). Infelizmente isso faz minhas expressões regulares desajeitado (veja acima) e não excessivamente internationalizable. Desculpas para isso.

Respondeu 10/12/2008 em 12:26
fonte usuário

votos
0

Estes não chegou a fazê-lo para o que eu precisava; como alguns foram quebrou ou não liberal suficiente. Por exemplo, se você tem uma pasta chamada stackoverflow.comnão ter pontos iria quebrá-lo. Implementações são inconsistentes sobre o que \wsignifica, então eu não recomendo o uso que, especialmente desde que sabe muito bem o que personagens que precisamos.

O seguinte é um exemplo festa para construir a regex:

#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\$"

Isto proporciona a modularidade para verificar as partes mais tarde, se for necessário. Para permitir que endereços IP no jogo adicionar 0-9às duas porções primeiros carta jogo da regex host.

Respondeu 27/09/2014 em 20:56
fonte usuário

votos
0

go final:

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

Isto também permite uma barra final opcional.

Respondeu 10/12/2008 em 15:48
fonte usuário

votos
0

OK, uma nova revisão para:

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

para explicar a. que podem estar presentes em um nome de arquivo.

Respondeu 10/12/2008 em 13:06
fonte usuário

votos
0

Depois de mais algumas revisões que estou usando:

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

que parece coincidir com os meus casos de teste e é responsável por nomes de host, FQDNs e endereços IP na parte do host. Ele também faz o caminho após os dois pontos opcional para permitir diretórios home implícitas.

Obrigado pela ajuda até agora - eu não manchar a falta de hostname, até que foi apontado.

Respondeu 10/12/2008 em 12:44
fonte usuário

votos
0

O SGM está chegando, é que você está fazendo

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

Onde você deve fazer

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

A resposta de Pax também é prático, mas não funcionarão sem o bracketing dupla adequada.

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

Respondeu 10/12/2008 em 12:28
fonte usuário

votos
0

expressões de colchetes ir dentro de suas próprias chaves. Está correspondentes qualquer um de dois pontos, 'a', 'L', 'm', 'n', ou 'U'.

E como Pax disse, você perdeu o nome do host. Mas as expressões de colchetes ainda estão errados.

Respondeu 10/12/2008 em 12:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more