C#の正規表現(Regex)で文字列を操作する基本を学ぼう
生徒
「先生、C#で文字列の中から特定のパターンを探したり、置き換えたりする方法ってありますか?」
先生
「いい質問ですね。そういうときに使うのが『正規表現(Regex)』という機能です。」
生徒
「正規表現って聞いたことはありますけど、難しそうです……。C#でも使えるんですか?」
先生
「もちろん使えますよ。最初は少し慣れが必要ですが、C#のRegexクラスを使えば簡単に文字列を検索・置換できます。では、基本から見ていきましょう!」
1. 正規表現(Regex)とは?
正規表現(せいきひょうげん)とは、「文字列の中に特定のパターンを見つけるためのルール(式)」のことです。たとえば、メールアドレスの形式を確認したり、数字だけを取り出したりする場合に使われます。
C#では、System.Text.RegularExpressions名前空間にあるRegexクラスを使うことで、正規表現を簡単に扱うことができます。
難しく聞こえるかもしれませんが、「パターンに合う文字を探すツール」と考えるとイメージしやすいです。
2. Regexを使って文字列を検索する基本
まずは、特定の単語が文字列の中に含まれているかどうかを調べる例を見てみましょう。C#では、Regex.IsMatchメソッドを使います。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "今日はC#のRegexを勉強します。";
string pattern = "Regex";
bool result = Regex.IsMatch(text, pattern);
if (result)
{
Console.WriteLine("指定した文字が見つかりました!");
}
else
{
Console.WriteLine("指定した文字は見つかりませんでした。");
}
}
}
指定した文字が見つかりました!
この例では、Regex.IsMatchを使って文字列に「Regex」という単語が含まれているかを調べています。true(真)なら見つかり、false(偽)なら見つからなかったという結果が返ります。
3. 正規表現で数字だけを抜き出してみよう
正規表現の強みは、「特定のパターンに一致する部分だけを取り出せる」ことです。たとえば、文章の中から数字だけを抜き出したいときに便利です。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "商品番号は12345です。";
string pattern = @"\d+"; // 「\d+」は1つ以上の数字を意味します。
Match match = Regex.Match(text, pattern);
if (match.Success)
{
Console.WriteLine("見つかった数字: " + match.Value);
}
}
}
見つかった数字: 12345
\d+というパターンは、「1つ以上の数字」を意味します。Regex.Matchメソッドを使うと、最初に見つかった一致部分を取得できます。正規表現ではこのように、「文字の形」をルールで表現することができます。
4. 文字列の一部を置き換える(Regex.Replace)
次に、Regex.Replaceを使って文字列の一部を別の文字に置き換える方法を学びましょう。これは、電話番号や郵便番号などのフォーマットを整えるときにも使われます。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "電話番号は08012345678です。";
string pattern = @"(\d{3})(\d{4})(\d{4})";
string replacement = "$1-$2-$3"; // 正規表現のグループを利用して区切る
string result = Regex.Replace(text, pattern, replacement);
Console.WriteLine(result);
}
}
電話番号は080-1234-5678です。
この例では、数字を3桁・4桁・4桁のグループに分けて、それぞれにハイフン(-)を挟んでいます。$1・$2・$3は、それぞれグループ化された部分を指します。
正規表現を使えば、ただの文字列検索だけでなく、柔軟な置換処理もできるのです。
5. よく使う正規表現パターンの例
ここで、C#でよく使われる正規表現パターンをいくつか紹介します。これを覚えておくと、文字列操作が一気に便利になります。
- \d:数字(0~9)に一致
- \w:英数字やアンダースコアに一致
- \s:空白文字(スペースやタブ)に一致
- .+:任意の文字が1文字以上
- ^:行の先頭
- $:行の末尾
たとえば、メールアドレスを判定する場合は次のようなパターンを使います。
string pattern = @"^[\w\.-]+@[\w\.-]+\.\w+$";
このように、正規表現をうまく使うことで、文字列のチェックや整形を自動化できます。
6. Regexオブジェクトを使って繰り返し検索する
複数の一致箇所をすべて取得したいときは、Regex.Matchesを使います。これで、文字列の中にあるすべての数字を抜き出すことができます。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "合計100円と200円と300円です。";
string pattern = @"\d+";
MatchCollection matches = Regex.Matches(text, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
}
}
100
200
300
このように、Regex.Matchesを使えば、文章中にあるすべての数値をリストのように取り出せます。C#でデータを集計したり、特定の形式を確認したりする際にとても便利です。
7. ポイント整理
この記事では、C#のRegexクラスを使って文字列を検索・抽出・置換する方法を学びました。最初は難しそうに感じるかもしれませんが、ルールを少しずつ覚えることで、複雑な文字列処理をシンプルに書けるようになります。
正規表現は、C#だけでなく他のプログラミング言語でも共通して使われる重要な技術です。ぜひ、実際にコードを打ちながら慣れていきましょう。
まとめ
C#の正規表現でできることを整理しよう
この記事ではC#の正規表現クラスを使って文字列を柔軟に操作するための基本的な考え方と具体的な使い方を順番に確認しました。正規表現はただの記号の集まりではなく文章やテキストデータの中から条件に合う文字列パターンを素早く見つけて取り出したり書き換えたりできる心強い道具です。最初は少しとっつきにくく感じますがパターンの意味とメソッドの役割を一つずつ理解していくとC#での文字列処理がとても楽になります。特に日付や数字やメールアドレスや電話番号のように決まった形をもつ文字列を扱う場面では正規表現を使えるかどうかでコードの分かりやすさも保守のしやすさも大きく変わります。 まず最初に学んだのはテキストの中に特定の単語や記号が含まれているかどうかを調べる方法でした。正規表現のパターンを書いてイズマッチメソッドに渡すだけで条件に一致するかどうかを真偽値で判定できます。この仕組みを理解しておくとメッセージのチェックや簡単な入力バリデーションなどを短いコードで表現できるようになります。続いてマッチメソッドを使って文章の中から最初に見つかった一致部分を取り出す方法も確認しました。本文から数字だけを抜き出したり商品番号を取り出したりする処理は業務アプリケーションでもよく登場するのでパターンとあわせて覚えておくと便利です。 さらにもう一歩進んだ使い方としてリプレイスメソッドを利用した置換処理も確認しました。電話番号の文字列を三桁四桁四桁のまとまりに分けてハイフンで区切る例のようにグループを使ってパターンの一部を再利用する考え方は正規表現ならではの表現力の高さを実感できる部分です。丸かっこのグループと番号付きのドル記法を組み合わせることで長い文字列の中から必要な部分を抜き出して見た目を整えた文字列に組み立て直すことができます。またマッチズメソッドを使えばテキストに含まれる複数の一致箇所をまとめて取り出すことができ合計金額の集計やログの解析などにも応用できます。 よく使うメタ文字の一覧も確認しました。ディーは数字を表しダブリューは英数字とアンダースコアを表しエスは空白文字を表すなど基本的なパターンを覚えておくと新しい正規表現を書きやすくなります。行頭を表すキャレットや行末を表すダラーのようなアンカーと組み合わせることで先頭から末尾までの形式をしっかりとチェックすることもできました。メールアドレス判定のように少し複雑な例でも意味を細かく分解して考えれば一つの長いパターンとして組み立てられることが分かったと思います。 正規表現を使うときには読みやすさも大切です。パターンが長くなりすぎると自分でも意味を忘れてしまうのでコメントをそえたり変数名で用途を表現したりして意図が伝わるコードを書く工夫も欠かせません。また何でもかんでも複雑な正規表現で書こうとせずシンプルな文字列メソッドと組み合わせて使うことでバランスのよい実装になります。今回学んだイズマッチマッチマッチズリプレイスといった基本的なメソッドを中心に丁寧に組み合わせていけば初心者でも実務レベルの文字列処理を書けるようになります。
実用イメージをつかむサンプルプログラム
最後に学んだ内容をひとつにまとめたイメージしやすい小さなサンプルを紹介します。入力された文章から金額だけを抜き出して一覧表示しさらに簡単な書式を整える処理です。実際の画面入力やログ解析でも同じ考え方で応用できるのでC#で文字列を扱うときの標準的なパターンとして覚えておくと安心です。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "商品Aは1000円 商品Bは2500円 商品Cは300円です。";
string pattern = @"\d+";
MatchCollection matches = Regex.Matches(text, pattern);
Console.WriteLine("見つかった金額一覧:");
foreach (Match match in matches)
{
Console.WriteLine(match.Value + "円");
}
string tel = "連絡先は09012345678です。";
string telPattern = @"(090)(\d{4})(\d{4})";
string formatted = Regex.Replace(tel, telPattern, "$1-$2-$3");
Console.WriteLine(formatted);
}
}
このサンプルではマッチズメソッドで複数の数字を順番に取り出し実際に金額の一覧として表示しています。またリプレイスメソッドを使って電話番号の文字列を三つのグループに分けて読みやすい形に整えています。同じ正規表現の考え方を使って合計金額を計算したり特定の商品だけを抽出したりといった発展的な処理にもつなげることができます。実際に自分で文字列を変えて動かしてみることでパターンとメソッドの関係がさらに深く理解できるでしょう。 C#での開発ではログファイルの解析フォーム入力値のチェックファイル名の検査などあらゆる場面で文字列を扱います。そのたびに細かい条件分岐を書くのではなく正規表現を使ってルールとして表現できるようになるとコードがすっきりして保守しやすくなります。この記事で学んだ基本的な使い方を土台にして少しずつ自分なりのパターンを増やしていけば現場でも十分通用する文字列処理の力が身につきます。
生徒
「今日の内容を通して正規表現はただ難しい記号ではなくて文字列の中から欲しい情報だけを拾い上げる仕組みなんだと分かりました。ディーやダブリューやエスのような基本的なパターンを覚えておけば文章の中から数字だけを抜き出したり空白を無視してチェックしたりできるのがとても便利だと感じました。」
先生
「そのとおりですね。特にマッチやマッチズを使って一致した部分を順番に取り出す方法は実務でもよく登場します。金額リストを作ったりログの一部だけを抜き出したりとさまざまな場面で応用できますから今日の例を何度か書き直して感覚をつかんでおくとよいですよ。」
生徒
「リプレイスを使って電話番号の形式をそろえる例も印象に残りました。丸かっこでグループ分けしてドルと数字で組み立て直す方法は最初少し不思議でしたが仕組みが分かるとすごくおもしろいです。自分のコードでも郵便番号や会員番号の表示を整えるときに試してみたいと思いました。」
先生
「よい発想ですね。同じ考え方でメールアドレスの形式チェックやユーザー名の制限などにも応用できます。ただしパターンが長くなると読みづらくなるのでコメントや分かりやすい変数名を使って意味が伝わる書き方を心がけてください。無理に一行で書こうとせず段階を分けて組み立てるのも立派な工夫です。」
生徒
「はい。これからは条件分岐だけで頑張るのではなく正規表現を使えないかどうかも考えながら文字列処理を書くようにしてみます。イズマッチマッチマッチズリプレイスの四つをまずはしっかり使いこなせるように練習していきたいです。」
先生
「その意識があれば十分です。少しずつパターンに慣れていけば自然と表現できることが増えていきますから焦らず試しながら身につけていきましょう。分からなくなったときは今回のコード例と説明に立ち戻って一つ一つ動きを確認してみてください。」