Проверьте, содержит ли строка какую-либо подстроку в массиве в PowerShell

Я изучаю PowerShell. Я хочу знать, как проверить, содержит ли строка какую-либо подстроку в массиве в PowerShell. Я знаю, как сделать то же самое в Python. Код указан ниже:

  any(substring in string for substring in substring_list)

Есть ли подобный код в PowerShell?

Мой код PowerShell приведен ниже.

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

Я хочу проверить $ s с $ a. Если какая-либо строка в $ a присутствует в $ s, вернуть True. Возможно ли это в PowerShell?

Ответ 1

Использование фактических переменных в вопросе для простоты:

$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

(Это примерно на 25% меньше символов, чем в ответе chingNotCHing, используя, конечно, те же имена переменных :-)

Ответ 2

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

должен строго следовать вашему одностроку

Ответ 3

Кодовый ответ майкла Соренса работает лучше всего, чтобы избежать ловушки частичного совпадения подстрок. Это просто нуждается в небольшой модификации регулярного выражения. Если у вас есть строка $s = "oner is first", код все равно будет возвращать true, поскольку "one" будет соответствовать "oner" (совпадение в PowerShell означает, что вторая строка содержит первую строку.

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

Добавьте некоторое регулярное выражение для границы слова '\ b', и r в 'oner' теперь вернет false:

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

Ответ 4

Для PowerShell вер. 5. 0+

Вместо

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

попробуйте эту более простую версию:

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

Возвращает $True, если подстрока $q находится в массиве строки $q.

Ответ 5

Один из способов сделать это:

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

Ответ 6

Можно выбрать подмножество строк, содержащих любую из следующих строк:

$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
  }