C#

【C#】正規表現の解説とRegexクラスの使い方

名無し君
名無し君
正規表現て何??
名無しちゃん
名無しちゃん
C#で正規表現を使うにはどうしたらいいの?

プログラムを実装していると、正規表現を扱う機会が少なからず一度は訪れることでしょう。

正規表現」とは、文字列のパターンを意味したメタ文字と呼ばれる特別な文字と、通常の文字を組み合わせて、1つの文字列で表現したものです。
この正規表現を利用することで、任意の文字列を検索することや書き換えることなどができます。それも細かい条件をとても短い正規表現で書くことができるのが特徴です。

例えば、任意の文字列が全て数値であるかどうかを正規表現で確認するには、^\d+$を使います。以下のように任意の文字列がとても長い場合でも、あっという間に判定ができてしまうのです。

正規表現^\d+$を使えば、数値判定も楽々。

・3141592653589793 ➡︎ 全て数値である

・314159265A589793 ➡︎ 全て数値でない

メタ文字を使うと検索条件が短くなるメリットはありますが、初めてみる人にとってはどういう意味なのかとても分かりにくいというデメリットがあります。

この記事では、初めての方でも理解できるように正規表現で使われるメタ文字の一覧と意味の説明をし、C#で正規表現を扱う方法について解説をします。

慣れないと分かりにくいですが、1つ1つのメタ文字の意味は明確です。覚えてしまえば、いろんな条件の正規表現が作れるようになれます。

 

プログラミングを更に学びたい方必見

選抜された現役エンジニアから学べるプログラミングスクールで、現場や副業で役に立つノウハウやスキルを習得してみませんか?

オンラインに特化しているので場所に捉われず、自分のライフスタイルに合わせて受講することができます。

副業に興味がある方に人気の「はじめての副業コース」をはじめ、Web開発やシステム開発・アプリ開発などカテゴリ毎に受講ができ、初心者の方でも挫折することなく学ぶことができます。

まずはこの機会に現役のプロに無料相談をしてみましょう。

\ プログラミングスクールの詳細を確認する /

正規表現のメタ文字

正規表現は、通常の文字と次のようなメタ文字を使って表現されます。主なメタ文字の説明と使用例を表に記載しています。

メタ文字説明正規表現の例一致する文字列の例
^行の先頭^aabc
行の末尾$cabc
.任意の1文字.a
[]カッコ内に含まれる任意の1文字と一致[abc]a、b、cいずれか
[^]カッコ内に含まれる文字以外と一致[^abc]a、b、c以外
*直前の文字を0回以上繰り返しと一致abc*ab、abc…
直前の文字を1回以上の繰り返しと一致abc+abc、abc…
直前の文字を0または1文字と一致abc?abまたはabc
+?直前の文字を1回以上繰り返しと一致abc+?abc、abc…
*?直前の文字を0回以上の繰り返しと一致abc*?ab、abc…
{n}
直前の文字の桁数を指定a{2}aa
{n,}直前の文字の最小桁数のみ指定a{2,}aa、aa…
{n,m}
直前の文字の最小桁数と最大桁数を指定a{2,3}aa、aaa
|いずれかの条件 (OR条件)に一致a|baまたはb
\直後の正規表現記号をエスケープ
a\\bca\bc

^(キャレット)は行頭を表します。例えば、”^apple”というパターンは、”apple”や”applewatch”という文字列にマッチします。”penapple”など先頭がappleから始まらない場合はマッチしません。

は行末を表します。例えば、”apple$”というパターンは、”penapple”という文字にマッチします。”applewatch”など行末がappleで終わらない場合はマッチしません。

[]は下表にあるように特定のパターンを作って使うことが可能です。

パターン説明一致する文字列の例
[0-9]0〜9の数値のいずれか0、1、2…
[^0-9]0〜9の数値以外a、b、c…
[A-Z]A〜Zまでの大文字アルファベットのいずれかA、B、C…
[A-Za-z]A〜Z、a〜zまでの大文字と小文字のアルファベットのいずれかA、B、C…、a、b、c…
[01][01]0と1の組み合わせ00、01、10、11
[A-Za-z][0-9]アルファベット1文字と数値1文字A0

これらのメタ文字を組み合わせて使うことで、検索や置換を行うためのパターンを短く簡潔に表現することができるのです。

メタ文字は定義済みの正規表現があります。この正規表現を使うことで更に簡潔に表現することができます。

パターン説明対応するパターン
\d0〜9の数値のいずれか[0-9]
\D0〜9の数値以外[^0-9]
\wアルファベット、アンダーバー、数値のいずれか[A-Za-z_0-9]
\Wアルファベット、アンダーバー、数値以外の文字[^A-Za-z_0-9]
\s空白文字[ \t\f\r\n]
\Sすべての非空白文字[^ \t\f\r\n]

ここまで読んでいただければ、記事の冒頭で書いた正規表現の意味を理解できるようになります。^\d+$を分解してみてみましょう。

  1. ^:文字の先頭
  2. ^\d:0〜9の数値が文字の先頭から始まる
  3. ^\d+?:0〜9の数値が文字の先頭から始まり、0〜9の数値を1回以上繰り返す 全て数値である

このように正規表現を使うことで、任意の文字列がパターンにマッチするかしないかをチェックすることができます。正規表現の確認ツールとして「正規表現チェッカー」がありますので、ツールを活用して意図したパターンになっているか確認してみましょう。

よく使う正規表現

お手軽に正規表現を使えるように、よく使用する正規表現をピックアップしています。

パターン説明一致する文字列の例
^\d+$半角数字(0〜9のいずれか)0、1、2…
^[a-zA-Z]+$半角英字(a〜z、A〜Zのいずれか)a、b…、A、B…
^[ぁ-んー]+$全角ひらがなしーしゃーぷ
^[ァ-ンヴー]+$全角カタカナシーシャープ
^[ァ-ン゙゚\-]+$半角カタカナシーシャープ
^(0\d*)$ゼロから始まる数字012345
^([1-9]\d*)$ゼロ以外から始まる数字12345
^\d{4}-\d{1,2}-\d{1,2}$日付(YYYY-MM-DD)2021-04-21
\d+\.\d+\.\d+\.\d+IPアドレス192.168.1.1
^\d{3}-\d{4}$郵便番号000−0000
^https?:\/\/URLhttps://
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
Emailアドレスsample@gmail.com
^(070|080|090)-\d{4}-\d{4}$携帯番号070-0000-0000

C#で正規表現を使う

C#で正規表現を扱うには、Regexクラスを使います。このクラスが定義されている名前空間をusingディレクティブで指定します。

using System.Text.RegularExpressions;

まずは基本となる、パターンに一致することを判定する方法についてです。

パターンに一致するか判定

パターンに一致することを判定するにはIsMatchメソッドを使います。
IsMatchメソッドは第1引数に検索対象の文字列を指定し、第2引数に正規表現のパターンを指定します。
サンプルとして検索対象の文字列が数値であるか確認する処理を以下に記載しています。

var str = "1234567890";
var result = Regex.IsMatch(str, @"^\d+$");
if (result)
{
    Console.WriteLine("パターンが一致しました。");
}
else
{
    Console.WriteLine("パターンが一致しませんでした。");
}

str = "ABC1234567890";
result = Regex.IsMatch(str, @"^\d+$");
if (result)
{
    Console.WriteLine("パターンが一致しました。");
}
else
{
    Console.WriteLine("パターンが一致しませんでした。");
}
実行すると結果は次のようになります。
パターンが一致しました。
パターンが一致しませんでした。

最初に一致したパターンの部分を抽出

最初に一致したパターンの部分を抽出するには、Matchメソッドを使います。Matchメソッドは第1引数に検索対象の文字列を指定し、第2引数に正規表現のパターンを指定します。
アルファベットと数値の組み合わせのパターンで、最初に一致した文字列を抽出するサンプルとアルファベットが続いているパターンで、最初に一致した文字列を抽出するサンプルを以下に記載しています。

var str = "ABC123DEF456GHI";
var match = Regex.Match(str, @"[A-Za-z][0-9]");
Console.WriteLine(match.Value);

str = "ABC123DEF456GHI";
match = Regex.Match(str, @"[A-Za-z]*");
Console.WriteLine(match.Value);
実行すると結果は次のようになります。
C1
ABC

一致したパターンの全ての部分を抽出

一致したパターンの全ての部分を抽出するには、Matchsメソッドを使います。Matchesメソッドは第1引数に検索対象の文字列を指定し、第2引数に正規表現のパターンを指定します。
サンプルとして検索対象の文字列で、数値部分を抽出するサンプルを以下に記載しています。

var str = "ABC123DEF456GHI";
var matchs = Regex.Matches(str, @"\d");

//一致した文字列の表示
foreach (Match match in matchs)
{
    Console.WriteLine(match.Value);
}
実行すると結果は次のようになります。
1
2
3
4
5
6

一致したパターンを置換

パターンに一致した文字列を任意の文字列に置換したい場合は、Replaceメソッドを使います。Replaceメソッドは第1引数に検索対象の文字列を指定し、第2引数に置換後の文字列を指定します。
サンプルとして検索対象の文字列で、数値部分を”0”に置換するサンプルを以下に記載しています。

var str = "ABC123DEF456GHI";

var regex = new Regex(@"\d");
var result = regex.Replace(str, "0");
Console.WriteLine(result);
実行すると結果は次のようになります。
ABC000DEF000GHI

正規表現のパターンに一致する部分を全ての文字列が置換されました。一致した文字列の一部だけを置換したい場合は、Replaceメソッドの第3引数に置換場所を指定します。
一致したパターンの2つ目まで置換することも可能です。

var str = "ABC123DEF456GHI";

var regex = new Regex(@"\d");
var result = regex.Replace(str, "0", 2);
Console.WriteLine(result);
実行すると結果は次のようになります。
ABC003DEF456GHI

一致したパターンで分割

指定したパターンに一致した文字列を区切り文字として分割したい場合は、Splitメソッドを使います。Splitメソッドは第1引数に検索対象の文字列を指定します。
数値部分を区切り文字として分割するサンプルを以下に記載しています。

var str = "ABC1DEF2GHI";

var regex = new Regex(@"\d");
var result = regex.Split(str);
foreach (var s in result)
{
    Console.WriteLine(s);
}
実行すると結果は次のようになります。
ABC
DEF
GHI

 

プログラミングを更に学びたい方必見

選抜された現役エンジニアから学べるプログラミングスクールで、現場や副業で役に立つノウハウやスキルを習得してみませんか?

オンラインに特化しているので場所に捉われず、自分のライフスタイルに合わせて受講することができます。

副業に興味がある方に人気の「はじめての副業コース」をはじめ、Web開発やシステム開発・アプリ開発などカテゴリ毎に受講ができ、初心者の方でも挫折することなく学ぶことができます。

まずはこの機会に現役のプロに無料相談をしてみましょう。

\ プログラミングスクールの詳細を確認する /

まとめ

正規表現で使われる符号の意味やC#で正規表現を扱う方法について説明をしました。

プログラムをする上で正規表現を使う機会がある場合は参考にしてみてください。

以上、最後まで読んでいただきありがとうございました。

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA