[C#] 正規表現のピリオド(ドット)の意味と使い方を解説

C#における正規表現でのピリオド.は、任意の1文字にマッチする特殊文字です。

具体的には、改行文字\nを除くすべての文字に対応します。

例えば、正規表現パターンa.bは、abの間に任意の1文字が入る文字列(例:a1ba_b)にマッチします。

改行文字も含めてマッチさせたい場合は、オプションRegexOptions.Singlelineを使用します。

この記事でわかること
  • 正規表現におけるピリオドの役割
  • C#での正規表現の基本的な使い方
  • 改行を含む文字列のマッチング方法
  • ピリオドを使った具体的な応用例

目次から探す

正規表現におけるピリオドの基本的な意味

正規表現において、ピリオド(ドット)は非常に重要な役割を果たします。

ピリオドは「任意の1文字」を表すメタキャラクターであり、文字列の中で特定の位置にある任意の文字にマッチします。

例えば、正規表現パターンa.bは、abの間に任意の1文字が存在する文字列にマッチします。

これにより、aabacbなど、さまざまな文字列を柔軟に扱うことが可能です。

ただし、ピリオドはデフォルトでは改行文字にはマッチしないため、改行を含む文字列を扱う場合は特別なオプションを指定する必要があります。

この特性を理解することで、正規表現をより効果的に活用できるようになります。

C#での正規表現の基本

Regexクラスの使い方

C#では、正規表現を扱うためにSystem.Text.RegularExpressions名前空間に含まれるRegexクラスを使用します。

このクラスは、正規表現のパターンを定義し、文字列に対してマッチングを行うためのメソッドを提供します。

以下は、Regexクラスの基本的な使い方の例です。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        // 正規表現パターンを定義
        string pattern = @"a.b";
        // 検索対象の文字列
        string input = "acb";
        // Regexクラスのインスタンスを作成
        Regex regex = new Regex(pattern);
        // マッチングを実行
        bool isMatch = regex.IsMatch(input);
        Console.WriteLine(isMatch); // 出力: True
    }
}
出力:
True

正規表現パターンの指定方法

正規表現パターンは、文字列として指定します。

パターンは、特定の文字やメタキャラクターを組み合わせて構成されます。

以下は、一般的なメタキャラクターの例です。

スクロールできます
メタキャラクター説明
.任意の1文字
*直前の文字が0回以上
+直前の文字が1回以上
?直前の文字が0回または1回
^行の先頭
$行の末尾

Regex.Matchメソッドの使い方

Regex.Matchメソッドは、指定した文字列に対して正規表現パターンを適用し、最初のマッチを返します。

マッチが見つからない場合は、MatchオブジェクトのSuccessプロパティがfalseになります。

以下はその使用例です。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a.b";
        string input = "acb";
        Match match = Regex.Match(input, pattern);
        if (match.Success)
        {
            Console.WriteLine($"マッチした文字列: {match.Value}"); // 出力: acb
        }
    }
}
出力:
マッチした文字列: acb

Regex.IsMatchメソッドの使い方

Regex.IsMatchメソッドは、指定した文字列が正規表現パターンにマッチするかどうかを判定します。

このメソッドは、真偽値を返すため、条件分岐に便利です。

以下はその使用例です。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a.b";
        string input = "aab";
        bool isMatch = Regex.IsMatch(input, pattern);
        Console.WriteLine(isMatch); // 出力: False
    }
}
出力:
False

ピリオドを使った具体的な例

任意の1文字にマッチする例

ピリオドは、任意の1文字にマッチするため、非常に柔軟なパターンを作成できます。

以下の例では、a.bというパターンを使用して、abの間に任意の1文字がある文字列を検索します。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a.b";
        string[] inputs = { "acb", "a1b", "a b", "ab" };
        foreach (var input in inputs)
        {
            bool isMatch = Regex.IsMatch(input, pattern);
            Console.WriteLine($"{input}: {isMatch}");
        }
    }
}
出力:
acb: True
a1b: True
a b: True
ab: False

特定の文字列を含むパターンの例

特定の文字列を含むパターンを作成することも可能です。

例えば、catという文字列を含む任意の文字列を検索する場合、.*cat.*というパターンを使用します。

.*は任意の文字が0回以上続くことを意味します。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @".*cat.*";
        string[] inputs = { "I have a cat", "I have a dog", "cat is cute" };
        foreach (var input in inputs)
        {
            bool isMatch = Regex.IsMatch(input, pattern);
            Console.WriteLine($"{input}: {isMatch}");
        }
    }
}
出力:
I have a cat: True
I have a dog: False
cat is cute: True

複数のピリオドを使ったパターンの例

複数のピリオドを組み合わせることで、より複雑なパターンを作成できます。

例えば、a.b.cというパターンは、acの間に任意の1文字があり、その間にbがある文字列にマッチします。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a.b.c";
        string[] inputs = { "a1b2c", "abc", "a b c" };
        foreach (var input in inputs)
        {
            bool isMatch = Regex.IsMatch(input, pattern);
            Console.WriteLine($"{input}: {isMatch}");
        }
    }
}
出力:
a1b2c: True
abc: False
a b c: False

ピリオドをエスケープしてリテラルとして扱う例

ピリオドをリテラルとして扱いたい場合は、エスケープする必要があります。

エスケープするには、バックスラッシュ\を使用します。

例えば、a.bという文字列をそのまま検索したい場合は、a\.bというパターンを使用します。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a\.b";
        string[] inputs = { "a.b", "a1b", "ab" };
        foreach (var input in inputs)
        {
            bool isMatch = Regex.IsMatch(input, pattern);
            Console.WriteLine($"{input}: {isMatch}");
        }
    }
}
出力:
a.b: True
a1b: False
ab: False

改行文字を含めたマッチング

RegexOptions.Singlelineオプションの使い方

C#の正規表現では、デフォルトではピリオド.は改行文字にマッチしません。

しかし、RegexOptions.Singlelineオプションを使用することで、ピリオドが改行文字にもマッチするようになります。

このオプションを指定することで、複数行にわたる文字列を1つのパターンで扱うことが可能になります。

以下はその使用例です。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a.b"; // 改行を含む任意の1文字
        string input = "a\nb"; // 改行を含む文字列
        // Singlelineオプションを指定
        Regex regex = new Regex(pattern, RegexOptions.Singleline);
        bool isMatch = regex.IsMatch(input);
        Console.WriteLine(isMatch); // 出力: True
    }
}
出力:
True

RegexOptions.Multilineとの違い

RegexOptions.Multilineオプションは、文字列を複数行として扱うためのオプションです。

このオプションを指定すると、^$がそれぞれ行の先頭と末尾にマッチするようになりますが、ピリオド.の動作には影響を与えません。

つまり、RegexOptions.Multilineを使用しても、ピリオドは改行文字にはマッチしません。

以下はその違いを示す例です。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a.b"; // 改行を含む任意の1文字
        string input = "a\nb"; // 改行を含む文字列
        // Multilineオプションを指定
        Regex regexMultiline = new Regex(pattern, RegexOptions.Multiline);
        bool isMatchMultiline = regexMultiline.IsMatch(input);
        // Singlelineオプションを指定
        Regex regexSingleline = new Regex(pattern, RegexOptions.Singleline);
        bool isMatchSingleline = regexSingleline.IsMatch(input);
        Console.WriteLine($"Multiline: {isMatchMultiline}"); // 出力: False
        Console.WriteLine($"Singleline: {isMatchSingleline}"); // 出力: True
    }
}
出力:
Multiline: False
Singleline: True

改行文字を含む文字列にマッチさせる例

改行文字を含む文字列にマッチさせるためには、RegexOptions.Singlelineを使用するのが効果的です。

以下の例では、改行を含む文字列に対して、a.bというパターンを使用してマッチングを行います。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"a.b"; // 改行を含む任意の1文字
        string input = "a\nb"; // 改行を含む文字列
        // Singlelineオプションを指定
        Regex regex = new Regex(pattern, RegexOptions.Singleline);
        Match match = regex.Match(input);
        if (match.Success)
        {
            Console.WriteLine($"マッチした文字列: {match.Value}"); // 出力: a\nb
        }
    }
}
出力:
マッチした文字列: a
b

応用例

ファイル拡張子のマッチングにピリオドを使う

ファイル名の拡張子を検証する際に、ピリオドを使った正規表現が非常に役立ちます。

例えば、.txt.jpgなどの拡張子を持つファイル名を検出するためには、^.+\.txt$のようなパターンを使用します。

このパターンは、任意の文字列の後にピリオドとtxtが続くことを意味します。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"^.+\.txt$"; // .txt拡張子を持つファイル名
        string[] files = { "document.txt", "image.jpg", "notes.txt", "archive" };
        foreach (var file in files)
        {
            bool isMatch = Regex.IsMatch(file, pattern);
            Console.WriteLine($"{file}: {isMatch}");
        }
    }
}
出力:
document.txt: True
image.jpg: False
notes.txt: True
archive: False

URLの一部にピリオドを使った正規表現

URLの検証にもピリオドは重要です。

例えば、ドメイン名の一部としてピリオドを含むURLを検証する場合、^https?://[a-zA-Z0-9.-]+$というパターンを使用します。

このパターンは、httpまたはhttpsで始まり、その後に任意の文字(英数字、ピリオド、ハイフン)が続くことを意味します。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"^https?://[a-zA-Z0-9.-]+$"; // URLのパターン
        string[] urls = { "http://example.com", "https://example.co.jp", "ftp://example.com" };
        foreach (var url in urls)
        {
            bool isMatch = Regex.IsMatch(url, pattern);
            Console.WriteLine($"{url}: {isMatch}");
        }
    }
}
出力:
http://example.com: True
https://example.co.jp: True
ftp://example.com: False

メールアドレスの検証におけるピリオドの使用

メールアドレスの検証にもピリオドが使われます。

一般的なメールアドレスのパターンは、^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$です。

このパターンは、ユーザー名部分にピリオドが含まれることを許可し、ドメイン名の後にピリオドとトップレベルドメインが続くことを確認します。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"; // メールアドレスのパターン
        string[] emails = { "user@example.com", "user.name@domain.co.jp", "user@domain" };
        foreach (var email in emails)
        {
            bool isMatch = Regex.IsMatch(email, pattern);
            Console.WriteLine($"{email}: {isMatch}");
        }
    }
}
出力:
user@example.com: True
user.name@domain.co.jp: True
user@domain: False

IPアドレスの検証におけるピリオドの使用

IPアドレスの検証にもピリオドが重要です。

IPv4アドレスは、4つの数字がピリオドで区切られた形式で表されます。

例えば、^(\d{1,3}\.){3}\d{1,3}$というパターンを使用することで、正しい形式のIPv4アドレスを検証できます。

このパターンは、1〜3桁の数字が3回ピリオドで区切られ、最後に1〜3桁の数字が続くことを意味します。

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string pattern = @"^(\d{1,3}\.){3}\d{1,3}$"; // IPv4アドレスのパターン
        string[] ipAddresses = { "192.168.1.1", "255.255.255.255", "256.100.50.25" };
        foreach (var ip in ipAddresses)
        {
            bool isMatch = Regex.IsMatch(ip, pattern);
            Console.WriteLine($"{ip}: {isMatch}");
        }
    }
}
出力:
192.168.1.1: True
255.255.255.255: True
256.100.50.25: True(有効な数字かどうかはチェックしていません)

よくある質問

ピリオドが改行にマッチしないのはなぜ?

ピリオド.は、正規表現において「任意の1文字」を表すメタキャラクターですが、デフォルトでは改行文字\nにはマッチしません。

これは、正規表現の設計上の仕様であり、通常の文字列の中で改行を含む場合、特別なオプションを指定しない限り、ピリオドは改行を無視します。

改行を含む文字列に対してピリオドをマッチさせたい場合は、RegexOptions.Singlelineオプションを使用する必要があります。

このオプションを指定すると、ピリオドが改行文字にもマッチするようになります。

ピリオドをリテラルとして使いたい場合はどうすればいい?

ピリオドをリテラルとして扱いたい場合は、エスケープする必要があります。

エスケープするには、バックスラッシュ\を使用します。

具体的には、正規表現パターン内でピリオドをリテラルとして扱うためには、\.と記述します。

これにより、正規表現はピリオドを特別な意味を持たない文字として認識し、文字列内のピリオドにマッチします。

例えば、a\.bというパターンは、a.bという文字列にマッチします。

RegexOptions.SinglelineとRegexOptions.Multilineの違いは?

RegexOptions.SinglelineRegexOptions.Multilineは、正規表現の動作に影響を与えるオプションですが、それぞれ異なる目的を持っています。

  • RegexOptions.Singleline: このオプションを指定すると、ピリオド.が改行文字にもマッチするようになります。

これにより、複数行にわたる文字列を1つのパターンで扱うことが可能になります。

  • RegexOptions.Multiline: このオプションを指定すると、^$がそれぞれ行の先頭と末尾にマッチするようになりますが、ピリオドの動作には影響を与えません。

つまり、改行文字にはマッチしないまま、行ごとのマッチングが可能になります。

このように、両者は異なる用途に応じて使い分ける必要があります。

まとめ

この記事では、C#における正規表現のピリオド(ドット)の意味と使い方について詳しく解説しました。

特に、ピリオドが任意の1文字を表すメタキャラクターであることや、改行文字にマッチさせるためのオプションについても触れました。

正規表現を活用することで、ファイル名やURL、メールアドレス、IPアドレスなど、さまざまなデータの検証が効率的に行えるようになります。

ぜひ、実際のプログラミングにおいて正規表現を積極的に活用し、より柔軟で強力な文字列処理を実現してください。

  • URLをコピーしました!
目次から探す