2017-08-10 7 views
0

配列に対して検証チェックを設定しようとしています。私は配列に対して検証する

$ValidDomain = "*.com","*.co.uk" 
$ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com" 
#while (!($ForwardDomain -contains $ValidDomain)) { 
while (!($ValidDomain.Contains($ForwardDomain))) { 
    Write-Warning "$ForwardDomain isn't a valid domain name format. Please try again." 
    $ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com" 
} 

次のコメントwhile行は、私はこれをテストしてきただけの別の方法である持っています。

Read-Hostというメッセージが表示されたときに「fjdkjfl.com」と入力すると、警告メッセージが表示され、有効であり、ループしています。

I代わり-contains-matchを使用して試みたが、メッセージを取得しました:解析

"* COMを* co.uk" - 何次のない数量詞{X、Y}を。

これは完全に間違っていますか?

答えて

2

Contains()-containsは期待通りに機能しません。代わりにregular expressionを使用してください:

$ValidDomain = '\.(com|co\.uk)$' 
$ForwardDomain = Read-Host ... 
while ($ForwardDomain -notmatch $ValidDomain) { 
    ... 
} 

あなたはこのような文字列のリストから$ValidDomainを構築することができます。

$domains = 'com', 'co.uk' 
$ValidDomains = '\.({0})$' -f (($domains | ForEach-Object {[regex]::Escape($_)}) -join '|') 

正規表現の内訳:

  • .:ドットはその特殊文字です改行以外の文字にマッチします。リテラルドットと一致させるには、エスケープシーケンス\.が必要です。
  • (...):カッコは、(キャプチャ)グループまたはサブ式を定義します。
  • |:パイプは交互(基本的に「OR」)を定義します。交替は、通常、交替を式の残りの部分と区別するためにグループ化構成に入れられます。
  • $:ドル記号は、文字列の最後に一致する特殊文字です。

-fオペレータのためのフォーマット文字列で{0}は、正規表現の一部ではなく、ここで(および必要に応じてどのように)を定義するプレースホルダ演算子の第2引数は、フォーマット文字列に挿入されます。

+0

ありがとうございました。治療のように動作します。私は、$ ValidDomain変数の構文とちょっと混乱しています。さらに "\"& "$"文字と "("& ")"の配置。コンストラクションのおかげで、非常に便利です。 – jshizzle

+0

さらに良いおかげで。はるかに明確です。今私を悩ませているのは、 '(\ .com | co \ .uk)$'が期待できるということです – jshizzle

+0

実際に私はそれを参照してください。これは、基本的には、括弧内にリストされている各項目の前にあるすべての文字の点を表しています。ゴッチャありがとう。 – jshizzle

関連する問題