【C#正規表現の使い方1】Matchメソッドで文字列を抽出する

C#で正規表現を扱う場合はRegexクラスを使用しますが、その中でも正規表現のパターンに応じて文字列を抽出する場合はMatchメソッドを使用します。
この記事では、Regex.Matchメソッドについて解説していきますので、ぜひ参考にしてください。
- プログラマー
- 文字列の中で数値の部分だけを抽出したいのですが、何か良い方法はあるでしょうか?
- プロジェクト
リーダー - 正規表現を使用して数値を抽出することができますよ。RegexクラスのMatchメソッドについて調べてみてください。
実行環境
・Windows 10 Home
・Visual Studio Community 2019
Regex.Matchメソッドの概要
C#で正規表現パターンと一致した文字列を抽出する場合、Regex.MatchメソッドまたはRegex.Matchesメソッドを使用します。2つの違いは以下のとおりです。
- ・Matchメソッドは、最初に一致した文字列を抽出
- ・Matchesメソッドは、一致したすべての文字列を抽出
各メソッドには複数の定義が存在しますが、主なパターンを例に挙げて紹介します。
1
2
|
public static System.Text.RegularExpressions.Match
Match (string 入力文字列, string 正規表現パターン);
|
入力文字列のうち、正規表現パターンで検索した結果をMatchオブジェクトで返します。Matchオブジェクトの主なプロパティも紹介しておきます。
プロパティ | 説明 |
---|---|
Index | 正規表現パターンに一致した文字列のうち、最初の文字が見つかる元の文字列の位置 |
Value | 入力文字列から、正規表現パターンに一致した文字列 |
また、Matchesメソッドの場合は、Matchオブジェクトのコレクションを返します。
正規表現を使用した文字列の抽出
まず、今回使用する正規表現パターンは以下となります。
パターン | 説明 |
---|---|
\d | 数値(0~9) |
\w | 英字、数値、記号 |
+ | 1回以上の一致 |
それでは、実際に正規表現を使用して文字列を抽出してみましょう。
最初に一致した部分を抽出する
Matchメソッドを使用して、文字列を抽出します。
1
2
3
4
5
6
7
|
String input = @"TEL:000-0000";
Match match = Regex.Match(input, @"\d+-\d+");
Console.WriteLine($"Index:{match.Index}");
Console.WriteLine($"Value:{match.Value}");
// → 以下の結果が出力されます。
// Index:4
// Value:000-0000
|
正規表現パターンとして「\d+-\d+」を指定しています。
「\d」は数値(0~9)、「+」は1回以上の一致、「-」は文字列そのままとなり
「-」を挟んで1回以上の数値を含む「000-0000」部分が一致するため、Valueに格納されています。Indexは1文字目を0としてカウントするため、先頭の数値(0)の位置は「4」となります。
次は、入力文字列にパターン一致が複数存在する場合です。
1
2
3
4
5
6
7
|
String input = @"A001Z99";
Match match = Regex.Match(input, @"\d+");
Console.WriteLine($"Index:{match.Index}");
Console.WriteLine($"Value:{match.Value}");
// → 以下の結果が出力されます。
// Index:1
// Value:001
|
入力文字列のうち、正規表現に一致する文字列は「001」と「99」で複数存在します。しかし、Matchでは最初の一致を返すため、「001」がValueに格納されていますね。
一致したすべての部分を抽出する
最初に一致する部分だけでなく、すべての部分を抽出したい場合は、Matchesメソッドを使用します。
1
2
3
4
5
6
7
8
9
10
11
|
String input = @"A001Z99";
MatchCollection matches = Regex.Matches(input, @"\d+");
foreach(Match match in matches){
Console.WriteLine($"Index:{match.Index}");
Console.WriteLine($"Value:{match.Value}");
}
// → 以下の結果が出力されます。
// Index:1
// Value:001
// Index:5
// Value:99
|
Matchメソッドを使用した際は「001」のみが抽出されましたが、Matchesメソッドを使用したことにより、「99」も抽出することができました。
重複する単語を識別して抽出する方法
重複する単語を識別するために、新たに使用する正規表現パターンは以下となります。
パターン | 説明 |
---|---|
\b | 単語の境界 |
? | 0回または1回の一致 |
( ) | 一致する部分文字列をグループ化※ |
\s | 空白文字と一致 |
\1 | \1のグループが示す部分文字列と一致 |
※グループは1から順番に割り当てられ、最初のグループを正規表現で使用したい場合は「\1」で表現する
1
2
3
4
5
6
7
8
9
10
|
String input = @"This is is a pen.
It is a very good pen.";
MatchCollection matches = Regex.Matches(input, @" \b(\w+?)\s\1\b");
foreach(Match match in matches){
Console.WriteLine($"Index:{match.Index}");
Console.WriteLine($"Value:{match.Value}");
}
// → 以下の結果が出力されます。
// Index:5
// Value:is is
|
単語が重複している「is is」の部分が抽出されていますね。
- プログラマー
- なるほど、正規表現を使いこなせれば複雑な文字列も取得できそうですね。
- プロジェクト
リーダー - そうですね。まずは試行錯誤しながら、コードを組んでみてください。
Regexクラスで文字列の抽出ができる
今回は、Regex.Matchメソッドを使用した文字列の抽出を紹介しました。Regexクラスには正規表現を使用した様々なメソッドが用意されています。初めて耳にしたという方も、この機会にぜひ活用してみてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)