Like vs. Match: Powershellの比較演算子の戦い
Powershellでは、ある文字列が別の文字列の中にあるかどうかを確認する方法がいくつかあります。 最も一般的な方法は、Like演算子とMatch演算子を使うことです。 これらの2つの演算子は、機能的には似ているように見えますが、ボンネットの中では2つの全く別の生き物です。 それでは、それぞれの演算子を使って、バトルロワイヤルでどちらが勝つか見てみましょう。 2回のラウンドを行い、ポイントシステムは次のとおりです:スピードに1ポイント、構文の簡単さに1ポイント。 両演算子を比較するために、トルストイの「戦争と平和」という本の全文を使います。 この本のテキストを文字列にするために、Get-Content
-Raw
$WarAndPeaceString = Get-Content C:\WarAndPeace.txt -Raw
小説「戦争と平和」の文章の中で、文末に「waldo」という単語が含まれているかどうかを競うので、文字列は「waldo」となります。 この死闘が始まる前に、Powershellの演算子について簡単に説明しておきましょう。
Powershell 比較演算子の簡単な説明
Like と Match はどちらも Powershell の演算子で、より具体的には比較演算子です。 最も基本的な比較演算子は、値を比較し、真偽値を返すために使用されます。 しかし、この記事では、Like演算子とMatch演算子を使って、別の文字列の中にある文字列を見つけることに焦点を当てます。
Meet the Like 演算子
Like 演算子は、ワイルドカードを使用する Powershell の比較演算子です。 It is a great day,:」という文字列の中から「day」という単語を見つける非常に簡単な例は次のようになります。 PS> 'it is a great day' -like '*day*'
True
False
PS> 'it is a great day' -like 'day'
day
day
という単語の両側にあるあらゆる種類のテキストを表現するために存在しなければならないワイルドカードです。 わかりやすく言うと、最初のステートメントは基本的に、”文字列「It is a great day」は、その中に「day」という単語があり、その左や右にどんなテキストがあるか?”と言っています。 一方、2つ目のステートメントは、”文字列’it is a great day’には’day’という単語が含まれているが、左にも右にもテキストがないか?”と言っています。 Like 演算子は、特殊文字を含まないシンプルな文字列があり、探している文字列がはっきりしている場合、このようなシンプルなマッチングに適しています。
Meet the Match 演算子
Match 演算子は、もう 1 つの Powershell 比較演算子です。 Likeに似ていますが、よりPowershellらしくなっています (ただし、少し複雑です)。 Match演算子は正規表現(regex)を使用します。 これは非常に大きなメリットで、Match
Like
PS> 'it is a great day' -match '*day*'
like
match
True,
Like
PS> 'it is a great day' -match 'day'
Match 演算子は、このような単純な一致以外にも多くのことができますが、この戦いでは、似たような属性を比較することで公平になるようにします。
Round No.1: Like vs. Match。
Like 例示した文字列に「wald」が含まれているかどうかを like 演算子で調べられるかどうか、また、どのくらいの速さで調べられるかを見てみましょう。 かなり速い! Like 演算子は、約 149 ミリ秒で一致するものを見つけることができました。 Match では、Match 演算子を導入して、どのような結果になるか見てみましょう。 勝者は明らかで、マッチ演算子に1ポイントです。 いいね 0、マッチ。 1
Round No.2: Like vs. Match: 構文の容易さ
このラウンドを可能な限り平等にするために、私は「構文の容易さ」を、最も理解しやすく、最も少ない文字数で済む演算子として定義します。 まずは、Like 演算子。 PS> $WarAndPeaceString -like '*waldo.*'
8 文字と悪くはありませんが、検索文字列の両側にあるアスタリスクを覚えておく必要があります。 Match 次は、Matchオペレータがリングに上がり、その実力を見せてくれます。 PS> $WarAndPeaceString -match 'waldo\.'
ここにはアスタリスクがないので、文字数は 7 だけです。 しかし、そのバックスラッシュは何をしているのでしょうか? 非常に紛らわしいですね。 match演算子はregexを使用しているので、regexでは検索文字列内の特定の特殊文字をエスケープする必要があります。 それは初心者にとってあまりにも奇妙なことなので、ここでは Like
にポイントを与えています。 いいね 1 マッチしています。 1 私たちの純粋な舌戦からすると、Like演算子とMatch演算子は互角に渡り合っているように見えます。 実際にはそうではないかもしれませんが、それぞれの演算子で何ができるのか、構文の違いについても少しは理解していただけたと思います。