[C#] 正規表現のピリオド(ドット)の意味と使い方を解説
C#における正規表現でのピリオド.
は、任意の1文字にマッチする特殊文字です。
具体的には、改行文字\n
を除くすべての文字に対応します。
例えば、正規表現パターンa.b
は、a
とb
の間に任意の1文字が入る文字列(例:a1b
やa_b
)にマッチします。
改行文字も含めてマッチさせたい場合は、オプションRegexOptions.Singleline
を使用します。
- 正規表現におけるピリオドの役割
- C#での正規表現の基本的な使い方
- 改行を含む文字列のマッチング方法
- ピリオドを使った具体的な応用例
正規表現におけるピリオドの基本的な意味
正規表現において、ピリオド(ドット)は非常に重要な役割を果たします。
ピリオドは「任意の1文字」を表すメタキャラクターであり、文字列の中で特定の位置にある任意の文字にマッチします。
例えば、正規表現パターンa.b
は、a
とb
の間に任意の1文字が存在する文字列にマッチします。
これにより、aab
やacb
など、さまざまな文字列を柔軟に扱うことが可能です。
ただし、ピリオドはデフォルトでは改行文字にはマッチしないため、改行を含む文字列を扱う場合は特別なオプションを指定する必要があります。
この特性を理解することで、正規表現をより効果的に活用できるようになります。
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
というパターンを使用して、a
とb
の間に任意の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
というパターンは、a
とc
の間に任意の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(有効な数字かどうかはチェックしていません)
よくある質問
まとめ
この記事では、C#における正規表現のピリオド(ドット)の意味と使い方について詳しく解説しました。
特に、ピリオドが任意の1文字を表すメタキャラクターであることや、改行文字にマッチさせるためのオプションについても触れました。
正規表現を活用することで、ファイル名やURL、メールアドレス、IPアドレスなど、さまざまなデータの検証が効率的に行えるようになります。
ぜひ、実際のプログラミングにおいて正規表現を積極的に活用し、より柔軟で強力な文字列処理を実現してください。