3

iSCSI 修飾名を検証する正規表現を作成しようとしています。修飾名の例は次のとおりですiqn.2011-08.com.example:storage。これは最小限の例です。より拡張された他の例を見てきました。

これまでのところ、これを検証する必要があるのは次のとおりです。

print "Enter a new target name: ";

my $target_name = <STDIN>;

chomp $target_name;

if ($target_name =~ /^iqn\.\d{4}-\d{2}/xmi) {

    print GREEN . "Target name is valid!" . RESET . "\n";

} else {

    print RED . "Target name is not valid!" . RESET . "\n";

}

説明タグであるため、後で解析する:つもりはありません。:

ドメイン名の大きさに制限はありますか?

4

2 に答える 2

5

RFC3270 (および RFC1035) によると、

/
   (?(DEFINE)
      (?<IQN_PAT>
         iqn
         \. 
         [0-9]{4}-[0-9]{2}
         \.
         (?&REV_SUBDOMAIN_PAT)
         (?: : .* )?
      )

      (?<EUI_PAT>
         eui
         \.
         [0-9A-Fa-f]{16}
      )

      (?<REV_SUBDOMAIN_PAT>
         (?&LABEL_PAT) (?: \. (?&LABEL_PAT) )*
      )

      (?<LABEL_PAT>
         [A-Za-z] (?: [A-Za-z0-9\-]* [A-Za-z0-9] )?
      )
   )

   ^ (?: (?&IQN_PAT) | (?&EUI_PAT) ) \z
/sx

eui 名が小文字の 16 進数を受け入れるかどうかは明らかではありません。それらを許可する方が安全だと考えました。

上記を要約すると、 が得られ/^(?:iqn\.[0-9]{4}-[0-9]{2}(?:\.[A-Za-z](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+(?::.*)?|eui\.[0-9A-Fa-f]{16})\z/sます。

(ちなみに、あなたの使い方/mは間違っています。あなたの の使い方は間違っていて、許可されているよりもはるかに多く一致する可能性があり/iます。)\d[0-9]

于 2011-09-09T01:46:19.617 に答える
0

前の部分だけが必要な場合:は、次の正規表現を使用できます。

if ($target_name =~ /^iqn\.(\d{4}-\d{2})\.([^:]+):/xmi) {
    my ($date, $reversed_domain_name) = ($1, $2);

正規表現[^:]+は、1 つ以上の非:記号に一致します。ドメイン名の形式が正しくなくても一致します。さらなる改善は、目的によって異なります。iSCSI 名の個々のコンポーネントを取得するだけですか、それとも構文を検証する必要がありますか?


ドメイン名の大きさに制限はありますか?

ウィキペディアから:

完全なドメイン名は合計で 253 を超えることはできません

于 2011-09-09T01:20:40.873 に答える