Like vs Match: Battle of The Powershell Comparison Operators
Powershell oferuje kilka różnych sposobów na sprawdzenie czy dany ciąg znaków znajduje się wewnątrz innego ciągu znaków. Najpopularniejszą metodą jest użycie operatorów Like i Match. Te dwa operatory mogą wydawać się podobne w funkcjonalności, ale pod maską, są to dwie bardzo różne bestie. Prześledźmy każdy z nich, aby zobaczyć, który z nich wygrałby battle royale! Będziemy mieli dwie rundy, z systemem punktowym w następujący sposób: jeden punkt za szybkość, i jeden punkt za łatwość składni. Aby uzyskać prawdziwe porównanie obu operatorów, użyjemy całego tekstu książki „Wojna i pokój” autorstwa Lwa Tołstoja. Aby uzyskać tekst tej książki w postaci łańcucha, używam cmdletu Get-Content
z parametrem -Raw
, który przypisuje 1440 stronom treść w postaci pojedynczego łańcucha, a nie tablicy. $WarAndPeaceString = Get-Content C:\WarAndPeace.txt -Raw
Konkurs będzie polegał na sprawdzeniu, czy tekst w powieści „Wojna i pokój” zawiera słowo „waldo” na końcu zdania, więc ciągiem będzie „waldo”. Zanim rozpocznie się ta walka na śmierć i życie, ważne jest, aby podać krótkie wyjaśnienie operatora Powershell. Następnie przyjrzymy się każdemu z naszych pretendentów; chcemy zapamiętać przegranego przeciwnika lub przynajmniej jego najbliższą rodzinę, którą należy powiadomić, kiedy to się skończy.
Krótkie wyjaśnienie operatorów porównania Powershell
Like i Match są operatorami Powershell; dokładniej, są to operatory porównania. W najbardziej podstawowym znaczeniu, operatory porównania są używane do porównywania wartości i zwracania wartości boolean True lub False. Jednak w tym artykule skupimy się na użyciu operatorów Like i Match do znalezienia ciągu znaków wewnątrz innego ciągu znaków. Obaj nasi przeciwnicy potrafią to zrobić, ale każdy z nich wykonuje to zadanie w nieco inny sposób.
Poznaj operator Like
Operator Like jest operatorem porównania Powershell, który używa symboli wieloznacznych. Bardzo prosty przykład, aby znaleźć słowo „dzień” w łańcuchu „To jest wspaniały dzień”: będzie wyglądał następująco: PS> 'it is a great day' -like '*day*'
To stwierdzenie zwróciłoby wartość True
. Jednakże, jeśli zrobię coś takiego, zwróciłoby to wartość False
PS> 'it is a great day' -like 'day'
Skąd ta różnica? Zwróć uwagę na gwiazdki otaczające day
w pierwszym przykładzie. Są to symbole wieloznaczne, które muszą być obecne, aby móc reprezentować dowolny rodzaj tekstu po obu stronach słowa day
. W prostym angielskim, pierwsze stwierdzenie w zasadzie mówi: „Czy ciąg 'it is a great day' ma w sobie słowo 'day', z dowolnym tekstem po lewej lub po prawej stronie?”. Tymczasem drugie stwierdzenie mówi: „Czy ciąg 'it is a great day' ma w sobie słowo 'day', ale nie ma tekstu po lewej i po prawej stronie?”. Operator Like działa dobrze dla prostych dopasowań, takich jak to, gdy masz prosty ciąg znaków bez znaków specjalnych i gdy wiesz dokładnie, którego ciągu szukasz.
Poznaj operator Match
Operator Match jest kolejnym operatorem porównania Powershell. Chociaż podobny do Like, jest on znacznie bardziej Powershellowy (aczkolwiek nieco bardziej skomplikowany). Operator Match używa wyrażeń regularnych (regex). Jest to ogromna zaleta i daje Match
zdecydowaną przewagę nad Like
. Jednakże, jeśli nigdy wcześniej nie używałeś wyrażeń regularnych, przygotuj się. Współpracownik, opisując wyrażenia regularne, powiedział kiedyś: „Ktokolwiek stworzył wyrażenia regularne, musiał być na prochach”. To nie może być bardziej prawdziwe. Prześledźmy jeszcze raz nasz poprzedni przykładowy ciąg znaków. PS> 'it is a great day' -match '*day*'
Właśnie podstawiłem słowo like
za match
. Jak myślisz, co by się stało? Czy zwróciłoby True,
jak nasz poprzedni przykład, czy coś innego? Widać, że działa to inaczej niż Like
. Nie pracujesz już tylko z prostym tekstem. Wkroczyłeś do królestwa regex, a rzeczy nie są takie same w świecie regex. Aby to poprawnie działało z operatorem Match, musiałbyś usunąć gwiazdki, ponieważ gwiazdki mają specjalne znaczenie w świecie regex. PS> 'it is a great day' -match 'day'
Operator Match może zrobić o wiele więcej niż tylko proste dopasowania takie jak to, ale dla tej bitwy postaram się uczynić ją sprawiedliwą poprzez porównanie podobnych atrybutów. Z tłem poza drogą, przejdźmy do rzeczy.
Runda nr 1: Like vs. Match: Which is faster?
Like Zobaczmy, czy operator like może dowiedzieć się, czy nasz przykładowy ciąg zawiera „waldo”, i jak szybko to się stało. Całkiem szybko! Operator Like był w stanie znaleźć dopasowanie w ciągu około 149 milisekund. Dopasowanie Teraz wprowadźmy operator Match i zobaczmy jak się sprawuje. Zwycięzca jest jasny; jeden punkt dla operatora Match! Like: 0, Match: 1
Runda nr 2: Like vs. Match: Łatwość składni
Aby uczynić tę rundę tak równą, jak to tylko możliwe, definiuję „łatwość składni” jako operator, który jest najłatwiejszy do zrozumienia i wymaga najmniej znaków. Like Up first, operator Like. PS> $WarAndPeaceString -like '*waldo.*'
Nie jest źle z ośmioma znakami, ale wymaga zapamiętania gwiazdek po obu stronach naszego ciągu wyszukiwania. Match Następnie operator Match wchodzi na ring i pokazuje nam, z czego jest zrobiony! PS> $WarAndPeaceString -match 'waldo\.'
Nie widzę tutaj żadnych gwiazdek, więc liczba znaków wynosi tylko siedem. Jednakże, co ten odwrotny ukośnik tam robi? To jest bardzo mylące. Ponieważ operator dopasowania używa regex, regex wymaga, abyś uciekał od pewnych znaków specjalnych w wyszukiwanym łańcuchu. To jest zbyt dziwne dla nowicjusza, więc daję Like
punkt tutaj. Like: 1, Match: 1 Z naszej czysto językowej bitwy wydaje się, że operatorzy Like i Match są równo dopasowani. Nawet jeśli to może, ale nie musi być rzeczywistość, mam nadzieję, że dostałeś dobrą demonstrację tego, co każdy operator może zrobić, wraz z odrobiną o różnicach w składni.