3

有効な ssh 接続文字列に一致する正規表現を記述しようとしても無駄です。

私は本当に次の形式の文字列を認識する必要があるだけです:

  • user@hostname:/some/path

しかし、暗黙的なホーム ディレクトリも一致させるとよいでしょう:

  • ユーザー@ホスト名:

私はこれまでのところ、この正規表現を思いつきました:

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

OK、さらに改訂:

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

を説明します。ファイル名に含まれている可能性があります。

于 2008-12-10T12:06:02.203 に答える
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

ブラケット式は、独自のブラケット内に入ります。コロン、'a'、'l'、'm'、'n'、または 'u' のいずれかと一致しています。

パックスが言ったように、あなたはホスト名を逃しました。しかし、ブラケット式はまだ間違っています。

于 2008-12-10T11:24:38.963 に答える
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は、ホスト正規表現の最初の 2 つの文字一致部分に追加します。

于 2014-09-27T19:56:53.627 に答える
0

さらにいくつかのリビジョンを使用した後、次を使用しています。

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

これは、ホスト部分のホスト名、FQDN、および IP アドレスのテスト ケースとアカウントに一致するようです。また、暗黙的なホーム ディレクトリを許可するために、コロンの後のパスをオプションにします。

これまでの助けに感謝します-指摘されるまで、ホスト名の欠如に気づきませんでした。

于 2008-12-10T11:44:50.873 に答える
0

最終的に:

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

これにより、オプションの末尾のスラッシュも可能になります。

于 2008-12-10T14:48:54.043 に答える