source

문자열에 PowerShell의 배열에 부분 문자열이 포함되어 있는지 확인합니다.

manysource 2023. 11. 6. 21:54

문자열에 PowerShell의 배열에 부분 문자열이 포함되어 있는지 확인합니다.

저는 파워쉘을 공부하고 있습니다.문자열에 PowerShell의 배열에 부분 문자열이 포함되어 있는지 확인하는 방법을 알고 싶습니다.저는 파이썬에서도 같은 방법을 할 줄 압니다.코드는 다음과 같습니다.

any(substring in string for substring in substring_list)

PowerShell에 사용 가능한 유사한 코드가 있습니까?

저의 PowerShell 코드는 아래와 같습니다.

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

$s를 $a로 검증하고 싶습니다.$a에 있는 문자열이 $s에 있으면 True를 반환합니다.파워쉘에서 가능합니까?

질문의 실제 변수를 사용하여 단순화하기:

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

$a에 포함되지 않도록 $s 수정:

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

(물론 같은 변수 이름을 사용하는 ChingNotCHING의 답변보다 약 25% 적은 문자입니다 :-)

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

당신의 외줄을 철저히 따라야 합니다.

PowerShell 버전 5.0+용

대신에.

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

이 간단한 버전을 사용해 보십시오.

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

이것은 돌아옵니다.$True만약에 부현이라면$q문자열 배열에 있습니다.$p.

다른 예:

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

6년 동안 아무도 이렇게 간단하고 읽을 수 있는 답을 주지 않았다는 것이 놀랍습니다.

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

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

따라서 배열을 수직 막대 "|"를 사용하여 문자열에 삽입하면 됩니다. 이것이 정규 표현식의 교대("OR" 연산자)이기 때문입니다.https://www.regular-expressions.info/alternation.html https://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

마이클 소렌스(Michael Sorens)의 코드 답변은 부분 서브스트링 일치의 함정을 피하기 위해 가장 효과적입니다.단지 약간의 정규장 수정만 필요합니다.만약 당신이 그 끈을 가지고 있다면.$s = "oner is first", 'one'이 'oneer'와 일치하므로 코드가 true로 반환됩니다(PowerShell의 일치는 두 번째 문자열에 첫 번째 문자열이 포함됨을 의미함).

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

단어 경계 '\b'에 일부 regex를 추가하면 ron 'oneer'는 false를 반환합니다.

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

(나는 그것이 오래된 스레드라는 것을 알고 있지만 적어도 미래에 이것을 보는 사람들을 도울 수 있을 것입니다.)

uses -match라는 응답이 있을 경우 오답이 발생합니다.예: $a-match $b가 ""인 경우 $a-match $b는 거짓 음성을 생성합니다.

사용하는 것이 더 좋은 답일 것입니다.포함 - 그러나 대소문자를 구분하므로 비교하기 전에 모든 문자열을 대문자 또는 소문자로 설정해야 합니다.

$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가 더 쉽습니다.

다음과 같은 문자열을 포함하는 문자열의 하위 집합을 선택할 수 있습니다.

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

한 가지 방법:

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

언급URL : https://stackoverflow.com/questions/31603128/check-if-a-string-contains-any-substring-in-an-array-in-powershell