Beschouw het volgende fragment:
"12-18" -Contains "-"
Je zou denken dat dit resulteert in True
, maar dat is niet zo. Dit evalueert in plaats daarvan tot false
. Ik weet niet zeker waarom dit gebeurt, maar het is wel zo.
Om dit te voorkomen, kun je dit gebruiken:
"12-18".Contains("-")
Nu wordt de uitdrukking geëvalueerd tot waar.
Waarom gedraagt het eerste codefragment zich zo? Is er iets speciaals aan -
dat niet goed samengaat met -Contains
? De documentatievermeldt er niets over.
Antwoord 1, autoriteit 100%
De operator -Contains
doet geen vergelijkingen van subtekenreeksen en de overeenkomst moet een volledige tekenreeks zijn en wordt gebruikt om collecties te doorzoeken.
Uit de documentatie waarnaar u heeft gelinkt:
-Bevat
Beschrijving: Insluitingsoperator. Geeft aan of een verzameling referentiewaarden een enkele testwaarde bevat.
In het door u gegeven voorbeeld werkt u met een verzameling die slechts één stringitem bevat.
Als u de documentatie leest waarnaar u linkt, ziet u een voorbeeld dat dit gedrag demonstreert:
Voorbeelden:
PS C:\> "abc", "def" -Contains "def"
True
PS C:\> "Windows", "PowerShell" -Contains "Shell"
False #Not an exact match
Ik denk dat je de -match
operator:
"12-18" -Match "-"
Wat True
retourneert.
Belangrijk:Zoals aangegeven in de opmerkingen en in de gekoppelde documentatie, moet worden opgemerkt dat de operator -match
reguliere expressiesom tekstovereenkomst uit te voeren.
Antwoord 2, autoriteit 18%
-Contains
is eigenlijk een verzamelingsoperator. Het is waar als de collectie het object bevat. Het is niet beperkt tot strings.
-match
en -imatch
zijn tekenreeksen voor reguliere expressies en stellen automatische variabelen in voor gebruik bij opnames.
-like
, -ilike
zijn SQL-achtige matchers.
Antwoord 3, autoriteit 10%
Je kunt like
gebruiken:
"12-18" -like "*-*"
Of split
voor contains
:
"12-18" -split "" -contains "-"
Antwoord 4
like
is het beste, of in ieder geval het gemakkelijkst.match
WORDT GEBRUIKT VOOR RGEX VERGELIJKINGEN.
Referentie: over vergelijking Operators