Проверьте, содержит ли строка какую-либо подстроку в массиве в 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
}