Like vs. Match: Battle of The Powershell Comparison Operators
Powershell biedt een paar verschillende manieren om te zien of een string in een andere string zit. De meest gebruikte methode is het gebruik van de Like en Match operatoren. Deze twee operatoren lijken qua functionaliteit op elkaar, maar onder de motorkap zijn het twee heel verschillende beesten. Laten we ze eens bekijken om te zien welke zou winnen in een battle royale! We houden twee rondes, met het volgende puntensysteem: één punt voor snelheid, en één punt voor syntaxisgemak. Om een echte vergelijking te maken gebruiken we de volledige tekst van het boek “Oorlog en Vrede,” van Leo Tolstoy. Om de tekst van dit boek in een string te krijgen gebruik ik het Get-Content
cmdlet met de -Raw
parameter, die de 1.440 pagina’s inhoud in een enkele string zet in plaats van in een array. $WarAndPeaceString = Get-Content C:\WarAndPeace.txt -Raw
De wedstrijd zal zijn om te zien of de tekst in de roman “Oorlog en Vrede” het woord “waldo” bevat aan het eind van een zin, dus de string zal “waldo” zijn. Voordat deze strijd-op-de-dood begint, is het belangrijk om een korte uitleg te geven van een Powershell operator. Daarna bekijken we elk van onze mededingers; we willen de verliezende tegenstander niet vergeten, of in ieder geval de nabestaanden waarschuwen als het voorbij is.
Een korte uitleg van Powershell Vergelijkingsoperatoren
Like en Match zijn beide Powershell operatoren; meer specifiek, het zijn vergelijkingsoperatoren. In de basis worden vergelijkingsoperatoren gebruikt om waarden te vergelijken en een boolean True of False waarde terug te geven. Dit artikel zal zich echter richten op het gebruik van de Like en Match operatoren om een string binnen een andere string te vinden. Beide operators kunnen dit, maar ze voeren de taak op een iets andere manier uit.
Met de Like operator
De Like operator is een Powershell vergelijkingsoperator die wildcards gebruikt. Een heel eenvoudig voorbeeld om het woord “day” te vinden in de string, “It is a great day,: zou ongeveer als volgt gaan: PS> 'it is a great day' -like '*day*'
Dit statement zou een True
waarde teruggeven. Als ik echter iets als dit doe, zou het een False
waarde teruggeven: PS> 'it is a great day' -like 'day'
Waarom het verschil? Let op de sterretjes rond day
in het eerste voorbeeld. Dit zijn jokertekens die aanwezig moeten zijn om elke soort tekst aan weerszijden van het woord day
weer te geven. In gewoon Nederlands, zegt de eerste verklaring in feite, “Heeft de string ‘het is een geweldige dag’ het woord ‘dag’ erin, met enige tekst links of rechts?” Ondertussen zegt het tweede statement, “Heeft de string ‘het is een geweldige dag’ het woord ‘dag’ erin, maar geen tekst links en rechts?” De Like operator werkt goed voor eenvoudige matching zoals deze wanneer je een eenvoudige string hebt zonder speciale tekens, en wanneer je precies weet naar welke string je op zoek bent.
Met de Match operator
De Match operator is een andere Powershell vergelijkingsoperator. Hoewel vergelijkbaar met Like, is het veel meer Powershell (maar ook iets ingewikkelder). De Match operator maakt gebruik van reguliere expressies (regex). Dit is een enorm voordeel en geeft Match
een duidelijke voorsprong op Like
. Als u echter nog nooit reguliere uitdrukkingen hebt gebruikt, bereid u dan voor. Een collega zei ooit over reguliere expressies: “Wie reguliere expressies heeft bedacht, moet aan de drugs zijn. Dit zou niet waarachtiger kunnen zijn. Laten we onze vorige voorbeeldstring nog eens gebruiken. PS> 'it is a great day' -match '*day*'
Ik heb zojuist het woord like
vervangen door match
. Wat denkt u dat er zou gebeuren? Zou het True,
teruggeven zoals ons vorig voorbeeld, of iets anders? Je kunt zien dat het anders werkt dan Like
. Je werkt niet alleen met eenvoudige tekst. Je bent in het rijk van regex beland, en dingen zijn niet hetzelfde in de regex wereld. Om dit goed te laten werken met de Match operator moet je de sterretjes verwijderen, omdat sterretjes een speciale betekenis hebben in de regex wereld. PS> 'it is a great day' -match 'day'
De Match operator kan veel meer dan alleen eenvoudige matches als deze, maar voor deze battle zal ik proberen het eerlijk te laten verlopen door alleen vergelijkbare attributen te vergelijken. Met de achtergronden uit de weg, laten we aan de slag gaan.
Ronde No. 1: Like vs. Match: Wat is sneller?
Like Laten we eens kijken of de like-operator kan achterhalen of onze voorbeeldstring “waldo” bevat, en hoe snel dat ging. Behoorlijk snel! De Like operator was in staat om de overeenkomst te vinden binnen ongeveer 149 milliseconden. Match Laten we nu de Match operator erbij halen en kijken hoe die het doet. De winnaar hier is duidelijk; een punt voor de match operator! Vind ik leuk: 0, Match: 1
Ronde nr.2: Like vs. Match: Syntax ease
Om deze ronde zo gelijk mogelijk te maken definieer ik “syntax ease” als de operator die het makkelijkst te begrijpen is en de minste tekens nodig heeft. Like Up eerst, de Like operator. PS> $WarAndPeaceString -like '*waldo.*'
Helemaal niet slecht met acht tekens, maar vereist wel dat je de sterretjes aan weerszijden van onze zoekreeks onthoudt. Match De volgende, de Match operator stapt in de ring en laat ons zien wat hij kan! PS> $WarAndPeaceString -match 'waldo\.'
Ik zie hier geen asterisken, dus het aantal karakters is slechts zeven. Maar, wat doet die backslash daar? Dat is erg verwarrend. Omdat de match operator gebruik maakt van regex, vereist regex dat je bepaalde speciale karakters in de zoek string laat ontsnappen. Dat is veel te vreemd voor een nieuwkomer, dus ik geef Like
hier de doorslag. Vind ik leuk: 1, Match: 1 Uit onze puur tongue-in-cheek strijd blijkt dat de Like en Match operatoren aan elkaar gewaagd zijn. Hoewel dit al dan niet de werkelijkheid is, hoop ik dat je een goede demonstratie hebt gekregen van wat elke operator kan doen, samen met een beetje over de verschillen in syntaxis.