「|」で区切られたいくつかのオプションをテストしてください。

「|」で区切られたいくつかのオプションをテストしてください。

複数のオプションで構成される文字列があります。値は | で区切られます。

オプション: 値は、次の 2 つのいずれかです。

[[:alnum:]]{3}:all

[[:alnum:]]{3}:FQDN

ここで、FQDN はホストの DNS 名です。

たとえば、

647:all|1bc:all|d1f:all|vf4:www.host.com|vk4:all|k22:www.another.com|bbd:all|opo:all

この文字列がルールと一致するかどうかをテストするために正規表現をどのように書くことができますか?

ベストアンサー1

647:all|1bc:all|d1f:all|...文字列の形式が正しく、上記のパターンと一致する部分が含まれているかどうかをテストしますか?

ドメイン名をどれだけ厳密に一致させるかによって、これらのいくつかは(EREでは)次のようになります。

[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)

|- で区切られた複数のコピーを含む完全な行もあります。

^[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)(\|[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+))*$

abcdこれにより、実際に正規化または有効な名前でなくても、ドメイン名または同じものを使用できます。foo..barより厳格なテストのために、ドメイン名部分は次のようになります。[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?

1つの大きな正規表現を使用する前に、文字列を分割して部分を個別にテストする方が良いかもしれません。

次のようにすると、目的のパターンと一致しない要素が印刷されます。

$ perl -lne 'chomp; for $a (split/\|/) { 
      print "mismatch: $a" if $a !~ /^[[:alnum:]]{3}:(all|[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?)$/; 
      }'   <<< '123:all|456:abcd|789:foo..bar|999:www.host.com'
mismatch: 456:abcd
mismatch: 789:foo..bar

おすすめ記事