DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

正規表現を使って文字列を置換する

補足:ここでは正規表現の説明はしません。.NET Frameworkの正規表現の基本は、「正規表現の基本」で説明しています。
補足:「正規表現テストツール」を使って正規表現のテストを行うことができますので、お役立てください。

正規表現を使って文字列の置換を行うには、RegexクラスのReplaceメソッドを使用します。ここではいくつかの具体例を紹介します。MSDNにも「日付形式の変更」という例が載っていますので、そちらも参考にしてください。

URLにリンクを付ける

次の例ではTextBox1に入力された文字列内のURLに自動的にリンク(<a>タグ)をつけて、TextBox1に結果を表示しています。なおこの正規表現パターンは、「Perlメモ」で紹介されているものです。

VB.NET
コードを隠すコードを選択
'URLにリンクを付ける 
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
    TextBox1.Text, _
    "s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+", _
    "<a href=""$&"">$&</a>")
C#
コードを隠すコードを選択
//URLにリンクを付ける
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
    TextBox1.Text,
    @"s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+",
    "<a href=\"$&\">$&</a>");

行末の空白文字を削除する

次の例ではTextBox1に入力された文字列からすべての行末の空白文字(半角スペース、全角スペース、タブ)を削除しています。先程の例では静的メソッドのReplaceを使いましたが、ここではインスタンスメソッドを使ってみます。

VB.NET
コードを隠すコードを選択
'パターンを指定してRegexオブジェクトを作成 
Dim r As New System.Text.RegularExpressions.Regex("[  \t]+(?=\r?\n|$)")

'行末の空白文字を削除 
TextBox1.Text = r.Replace(TextBox1.Text, "")
C#
コードを隠すコードを選択
//パターンを指定してRegexオブジェクトを作成
System.Text.RegularExpressions.Regex r =
    new System.Text.RegularExpressions.Regex(@"[  \t]+(?=\r?\n|$)");

//行末の空白文字を削除
TextBox1.Text = r.Replace(TextBox1.Text, "");

ちなみに、パターンを"[  \t]+$"として、RegexOptions.Multilineオプションを付けたとしても、改行文字が"\r\n"ならば、行末の空白文字を削除することはできません。なぜならば、$ は \n の前、 \r の後ろとマッチするためです。

行頭に引用記号を挿入する

次の例ではTextBox1に入力された文字列の行頭に「< 」を挿入しています。パターンの「^」は0幅ですが、置換に利用できます。

VB.NET
コードを隠すコードを選択
'行頭に引用記号"> "を挿入する 
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
    TextBox1.Text, _
    "^", _
    "> ", _
    System.Text.RegularExpressions.RegexOptions.Multiline)
C#
コードを隠すコードを選択
//行頭に引用記号"> "を挿入する
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
    TextBox1.Text, "^", "> ",
    System.Text.RegularExpressions.RegexOptions.Multiline);

連続する同じ行を削除する

次の例ではTextBox1に入力された文字列から連続する同じ行を削除しています。つまり、同じ内容の行が連続している場合、それを1行だけにします。ここで使用している正規表現パターンは、「Regular-Expressions.info」で紹介されているものです。

VB.NET
コードを隠すコードを選択
'連続する同じ行を削除 
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
    TextBox1.Text, _
    "^(.*)(\r?\n\1)+$", _
    "$1", _
    System.Text.RegularExpressions.RegexOptions.Multiline)
C#
コードを隠すコードを選択
//連続する同じ行を削除
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
    TextBox1.Text,
    @"^(.*)(\r?\n\1)+$",
    "$1",
    System.Text.RegularExpressions.RegexOptions.Multiline);

日付のフォーマットを変更する

「2000/10/22」のように「/」で区切られている形式の日付を「2000年10月22日」と変更する例を示します。

VB.NET
コードを隠すコードを選択
'"2000/10/22"のような形式を"2000年10月22日"のように変換する 
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
    TextBox1.Text, _
    "(?<year>(?:\d\d)?\d\d)/(?<month>\d\d?)/(?<day>\d\d?)", _
    "${year}年${month}月${day}日")
C#
コードを隠すコードを選択
//"2000/10/22"のような形式を"2000年10月22日"のように変換する
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
    TextBox1.Text,
    @"(?<year>(?:\d\d)?\d\d)/(?<month>\d\d?)/(?<day>\d\d?)",
    "${year}年${month}月${day}日");

MatchEvaluatorデリゲートを使用する

MatchEvaluatorデリゲートを使用すれば、もっと複雑な置換が可能です。

次の例では、日付の部分を1日増やした日付と置換しています。

VB.NET
コードを隠すコードを選択
'Button1のClickイベントハンドラ 
Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

    '日付の部分("2000/10/22"のような形式)を1日増やす 
    TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
        TextBox1.Text, _
        "(?<year>(?:\d\d)?\d\d)/(?<month>\d\d?)/(?<day>\d\d?)", _
        New System.Text.RegularExpressions.MatchEvaluator(AddressOf IncrementDay))
End Sub

'MatchEvaluatorデリゲートメソッド 
Private Shared Function IncrementDay( _
    ByVal m As System.Text.RegularExpressions.Match) As String

    Dim dt As DateTime
    'マッチした文字列を日時に変換 
    If DateTime.TryParse(m.Value, dt) Then
        '1日増やす 
        Return dt.AddDays(1).ToShortDateString()
    Else
        Return m.Value
    End If
End Function
C#
コードを隠すコードを選択
//Button1のClickイベントハンドラ
private void Button1_Click(object sender, System.EventArgs e)
{
    //日付の部分("2000/10/22"のような形式)を1日増やす
    TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
        TextBox1.Text,
        @"(?<year>(?:\d\d)?\d\d)/(?<month>\d\d?)/(?<day>\d\d?)",
        new System.Text.RegularExpressions.MatchEvaluator(IncrementDay));
}

//MatchEvaluatorデリゲートメソッド
private static string IncrementDay(System.Text.RegularExpressions.Match m)
{
    DateTime dt;
    //マッチした文字列を日時に変換
    if (DateTime.TryParse(m.Value, out dt))
    {
        //1日増やす
        return dt.AddDays(1).ToShortDateString();
    }
    else
    {
        return m.Value;
    }
}
  • 履歴:
  • 2009/5/18 全体的に書き換える。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。