文字列の中から、特定のパターン(注文番号、ID、金額など)に合致する部分を探し出し、最初に見つかった1つだけを取得するには Regex.Match メソッドを使用します。
また、正規表現の「グループ化 ()」という機能を使うと、「注文ID全体」ではなく「IDの中の数字部分だけ」をピンポイントで抜き出すことも可能です。
目次
実装サンプル:注文番号の抽出
以下のコードでは、メールの件名文字列から「注文番号(Order-XXXX)」を探し出し、その番号部分だけを取り出しています。
サンプルコード
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
// 解析対象の文字列(メールの件名など)
string subject = "Re: [Order-7721] 配送状況の確認について";
Console.WriteLine($"解析対象: {subject}\n");
// ---------------------------------------------------------
// パターン1: マッチした部分をそのまま取得する
// ---------------------------------------------------------
// @"Order-\d+" の意味:
// Order- : "Order-" という文字そのもの
// \d+ : 数字が1回以上続く
Match m1 = Regex.Match(subject, @"Order-\d+");
if (m1.Success)
{
// Value プロパティには、マッチした文字列全体が入ります
Console.WriteLine($"パターン1検出: {m1.Value}");
}
Console.WriteLine("---");
// ---------------------------------------------------------
// パターン2: 丸括弧 () を使って、数字部分だけを抜き出す
// ---------------------------------------------------------
// @"Order-(\d+)" の意味:
// Order- : "Order-" という文字
// (\d+) : 数字部分をグループ化してキャプチャする
Match m2 = Regex.Match(subject, @"Order-(\d+)");
if (m2.Success)
{
// Groups[0] はマッチした全体 ("Order-7721")
Console.WriteLine($"全体マッチ : {m2.Groups[0].Value}");
// Groups[1] は1つ目の () の中身 ("7721")
// これで「数字だけ」を取り出せます
Console.WriteLine($"数字のみ抽出 : {m2.Groups[1].Value}");
}
}
}
実行結果
解析対象: Re: [Order-7721] 配送状況の確認について
パターン1検出: Order-7721
---
全体マッチ : Order-7721
数字のみ抽出 : 7721
解説と技術的なポイント
1. Match オブジェクト
Regex.Match を実行すると、結果として Match クラスのデータが返ってきます。
Success: パターンが見つかったかどうか(true/false)。値を取り出す前に必ずチェックします。Value: 正規表現に一致した文字列全体が入っています。
2. Groups プロパティ(部分抽出)
正規表現の中でカッコ ( ) を使うと、その部分だけを「グループ」として個別に保存できます。これが Groups 配列に格納されます。
Groups[0]: マッチした全体(Valueと同じ内容)。Groups[1]: 1つ目の( )にマッチした中身。Groups[2]: 2つ目の( )があればその中身。
これを使うと、「Key=Value」のような形式から「Value」だけを取り出したり、今回の例のように「固定文字を除いたID番号」だけを取り出す処理が簡単に書けます。
