DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

C#でLike演算子の代わりになるものは?

C#にVBのLike演算子はありません。これと同等の処理をするには、Regexクラス(System.Text.RegularExpression名前空間)のIsMatchメソッドを使う方法、つまり正規表現を使う方法、があります。Like演算子の"*"、"?"、"#"はそれぞれ正規表現では、".*"、"."、"\d"に置き換えることが出来ます。Like演算子の"[]"は正規表現でも"[]"で、Like演算子の"[!]"は正規表現では"[^]"と表現できます。

正規表現の"."は改行文字以外の文字を表すため、改行文字を含む文字列の比較では同一の結果とならないかもしれません。このような時は一致オプションにRegexOptions.Singlelineを指定し、単一行モードとします。このことにより、"."はすべての文字と一致するようになります。

さらに、Like演算子は2つの文字列が完全に一致するかを調べるのに対して、IsMatchメソッドは一致する箇所があるか調べるものです。よって、IsMatchメソッドでは検索パターン文字列の前後に"^"と"$"を付ける必要がありそうです。

Like演算子の動作は、Option Compareステートメントによって変わります。Option CompareステートメントがTextの時ように大文字と小文字を区別しないならば、一致オプションにRegexOptions.IgnoreCaseを指定します。Regexクラスは規定では現在のカルチャを使用しますが、Option CompareステートメントがBinaryの時ようにカルチャの違いを無視するには、一致オプションにRegexOptions.CultureInvariantを指定します。

当然ですが、検索パターン文字列に正規表現で使われるメタ文字が含まれているときは、これをエスケープしておかなければいけません。なおこれはRegex.Escapeメソッドを使ってできます。

実際にこの変換を使用した例を下に示します。この例ではVBのLike演算子のヘルプでのサンプルをC#に変換してみました。

C#
コードを隠すコードを選択
//using System.Text.RegularExpressions;
//がソースファイルの一番上に書かれているものとする

bool myCheck;

//myCheck = "F" Like "F"
myCheck = Regex.IsMatch("F", "^F$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "F" Like "f"
myCheck = Regex.IsMatch("F", "^f$", RegexOptions.Singleline);
//myCheck: false

//myCheck = "F" Like "FFF"
myCheck = Regex.IsMatch("F", "^FFF$", RegexOptions.Singleline);
//myCheck: false

//myCheck = "aBBBa" Like "a*a"
myCheck =
    Regex.IsMatch("aBBBa", "^a.*a$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "F" Like "[A-Z]"
myCheck =
    Regex.IsMatch("F", "^[A-Z]$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "F" Like "[!A-Z]"
myCheck =
    Regex.IsMatch("F", "^[^A-Z]$", RegexOptions.Singleline);
//myCheck: false

//myCheck = "a2a" Like "a#a"
myCheck =
    Regex.IsMatch("a2a", "^a\\da$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "aM5b" Like "a[L-P]#[!c-e]"
myCheck = Regex.IsMatch(
    "aM5b", "^a[L-P]\\d[^c-e]$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "BAT123khg" Like "B?T*"
myCheck = Regex.IsMatch(
    "BAT123khg", "^B.T.*$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "CAT123khg" Like "B?T*"
myCheck = Regex.IsMatch(
    "CAT123khg", "^B.T.*$", RegexOptions.Singleline);
//myCheck: false
  • 履歴:
  • 2008/08/08 参考に「正規表現と Like 演算子」を追加。
  • 2008/08/20 Option Compareステートメントに関する記述を追記。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。