根据动态条件排除数组项

时间:2015-07-12 02:12:02

标签: regex string powershell

我有一个字符串数组,如:

  • File1中
  • 文件2
  • File1_s1
  • File2_s1
  • 打印$
  • PSDrive来
  • PSParentPath

我需要选择所有不符合动态规则集的字符串。我真的不需要花哨的正则表达式,我只想匹配一些非常简单的正则表达式规则。基本上是:

        var request = WebRequest.Create("http://maps.googleapis.com/maps/api/geocode/json?address=" + address +" +View,+CA&sensor=true_or_false");
        var response = (HttpWebResponse)request.GetResponse();
        request.ContentType = "application/json; charset=utf-8";

但是我需要一个由函数输入指定的动态数量的-ands。有没有简单的方法呢?

2 个答案:

答案 0 :(得分:1)

好的,你可以这样做

$omits = "_s1","Print$"
$regex = '({0})' -f (($omits | ForEach-Object{[regex]::Escape($_)}) -join "|")

$arr | Where-Object{$_ -notmatch $regex}

$omits将包含您想要-match / -notmatch的字符串列表。然后我们取每个成员并在其上运行一个正则表达式转义($是一个特殊的正则表达式字符。行结束锚)获取每个擦除字符串并构建一个匹配组。所以在上面的例子中$regex将是

(_s1|Print\$)

根据需要向$omit添加更多条目。这将过滤结果为

File1
File2
PSDrive
PSParentPath

如果您可以信任逃避自己的正则表达式,那么您的选择就会更多。

$omits = "_s1","Print\$","^PS"
$regex = '({0})' -f ($omits -join "|")

这样PS就必须在字符串的开头。

答案 1 :(得分:0)

正如@Matt建议的那样,你的字符串static void main(...){}中没有通配符基本上等同于-NotLike(然后你可以使用-ne)。我假设您的示例缺少通配符,但实际模式不是。

-NotIn

或者你可以做一些基本匹配:

$patternArray = 'File1','File2','File1_s1','File2_s1','Print$','PSDrive','PSParentPath';
foreach ($pattern in $patternArray) {
    $Arr = $Arr | Where-Object {$_.Name -notlike $pattern};
}