检查字符串是否包含PowerShell中数组中的任何子字符串

wb1gzix0  于 2023-06-29  发布在  Shell
关注(0)|答案(8)|浏览(201)

我正在学习PowerShell。我想知道如何在PowerShell中检查字符串是否包含数组中的任何子字符串。我知道如何在Python中做同样的事情。代码如下:

any(substring in string for substring in substring_list)

PowerShell中是否有类似的代码?
下面是我的PowerShell代码。

$a = @('one', 'two', 'three')
$s = "one is first"

我想用$a验证$s。如果$a中的任何字符串出现在$s中,则返回True。在PowerShell中可以吗?

qxgroojn

qxgroojn1#

为简单起见,使用问题中的实际变量:

$a = @('one', 'two', 'three')
$s = "one is first"
$null -ne ($a | ? { $s -match $_ })  # Returns $true

修改$s以 * 不 * 包括$a中的任何内容:

$s = "something else entirely"
$null -ne ($a | ? { $s -match $_ })  # Returns $false

(That的字符数比chingNotCHing's answer少了25%,当然使用了相同的变量名:-)

rwqw0loc

rwqw0loc2#

($substring_list | %{$string.contains($_)}) -contains $true

应该严格按照你的俏皮话

lqfhib0f

lqfhib0f3#

适用于PowerShell版本5.0+

而不是

$null -ne ($a | ? { $s -match $_ })

试试这个简单的版本:

$q = "Sun"
$p = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
[bool]($p -match $q)

如果子字符串$q在字符串$p的数组中,则返回$True
另一个例子:

if ($p -match $q) {
    Write-Host "Match on Sun !"
}
rxztt3cl

rxztt3cl4#

MichaelSorens的代码答案最好地避免了部分子串匹配的陷阱。它只需要一个小小的正则表达式修改。如果你有字符串$s = "oner is first",代码仍然会返回true,因为'one'将匹配'oner'(PowerShell中的匹配意味着第二个字符串包含第一个字符串)。

$a = @('one', 'two', 'three')
$s = "oner is first"
$null -ne ($a | ? { $s -match $_ })  # Returns $true

为单词边界'\b'添加一些正则表达式,'oner'上的r现在将返回false:

$null -ne ($a | ? { $s -match "\b$($_)\b" })  # Returns $false
smtd7mpg

smtd7mpg5#

我很惊讶,在6年没有人给这个更简单和可读的答案

$a = @("one","two","three")
$s = "one1 is first"

($s -match ($a -join '|')) #return True

因此,只需使用竖线将数组内爆为字符串“|”,因为这是正则表达式中的交替(“OR”运算符)。https://www.regular-expressions.info/alternation.htmlhttps://blog.robertelder.org/regular-expression-alternation/
另外请记住,接受的答案不会搜索完全匹配。如果你想要精确匹配,你可以使用\B(单词边界)https://www.regular-expressions.info/wordboundaries.html

$a = @("one","two","three")
$s = "one1 is first"

($s -match '\b('+($a -join '|')+')\b') #return False
7nbnzgx9

7nbnzgx96#

(我知道这是一个老的线程,但至少我可以帮助人们在未来看这个。
任何使用-match的响应都将产生错误的答案。例如:$a -match $B如果$b是“,则会产生假阴性。”
更好的答案是使用.Contains -但它区分大小写,因此在比较之前必须将所有字符串设置为大写或小写:

$a = @('one', 'two', 'three')
$s = "one is first"
$a | ForEach-Object {If ($s.toLower().Contains($_.toLower())) {$True}}

返回$True

$a = @('one', 'two', 'three')
$s = "x is first"
$a | ForEach-Object {If ($s.toLower().Contains($_.toLower())) {$True}}

不返回任何内容
你可以调整它返回$True或$False,如果你愿意的话,但IMO上面的更容易。

mwg9r5ms

mwg9r5ms7#

可以选择包含任何字符串的字符串子集,如下所示:

$array = @("a", "b")
$source = @("aqw", "brt", "cow")

$source | where { 
    $found = $FALSE
    foreach($arr in $array){
        if($_.Contains($arr)){
            $found = $TRUE
        }
        if($found -eq $TRUE){
            break
        }
    }
    $found
  }
8dtrkrch

8dtrkrch8#

一种方法是:

$array = @("test", "one")
$str = "oneortwo"
$array|foreach {
    if ($str -match $_) {
        echo "$_ is a substring of $str"
    }
}

相关问题