2017-08-10 50 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”显示警告消息,而不是说它是有效的并且保持循环。

我一直在使用的-match代替-contains尝试,但得到的消息:

解析 “* 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 '|') 

正则表达式崩溃:

  • .:该点是一个特殊字符匹配除换行符之外的任何字符。要匹配文字点,您需要转义序列\.
  • (...):圆括号定义(捕获)组或子表达式。
  • |:管道定义了一个交替(基本上是“或”)。通常将交替放置在分组构造中以区分交替与表达的其余部分。
  • $:美元符号是一个与字符串结尾匹配的特殊字符。

在格式字符串为-f操作者的{0}不是正则表达式的一部分,而是用于定义(和任选的如何)操作的第二个参数被插入到格式字符串的占位符。

+0

非常感谢。像一种享受。我对$ ValidDomain变量的语法有点困惑。更多的是“\”和“$”字符以及“(”&“)”的位置。感谢这个构造加法,非常有用。 – jshizzle

+0

更好谢谢。更清楚。现在唯一的一件事情就是我期望'(\ .com | co \ .uk)$',但为什么开启者支架位于它的位置? – jshizzle

+0

其实我看到它。它基本上是在圆括号中列出的每个项目之前的每个项目上都有一个字面点。谢谢。 – jshizzle