補足:ここでは正規表現の説明はしません。.NET Frameworkの正規表現の基本は、「正規表現の基本」で説明しています。
補足:「正規表現テストツール」を使って正規表現のテストを行うことができますので、お役立てください。
正規表現を使って文字列の置換を行うには、RegexクラスのReplaceメソッドを使用します。ここではいくつかの具体例を紹介します。MSDNにも「日付形式の変更」という例が載っていますので、そちらも参考にしてください。
次の例ではTextBox1に入力された文字列内のURLに自動的にリンク(<a>タグ)をつけて、TextBox1に結果を表示しています。なおこの正規表現パターンは、「Perlメモ」で紹介されているものです。
'URLにリンクを付ける
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
TextBox1.Text, _
"s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+", _
"<a href=""$&"">$&</a>")
//URLにリンクを付ける
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
TextBox1.Text,
@"s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+",
"<a href=\"$&\">$&</a>");
次の例ではTextBox1に入力された文字列からすべての行末の空白文字(半角スペース、全角スペース、タブ)を削除しています。先程の例では静的メソッドのReplaceを使いましたが、ここではインスタンスメソッドを使ってみます。
'パターンを指定してRegexオブジェクトを作成 Dim r As New System.Text.RegularExpressions.Regex("[ \t]+(?=\r?\n|$)") '行末の空白文字を削除 TextBox1.Text = r.Replace(TextBox1.Text, "")
//パターンを指定して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幅ですが、置換に利用できます。
'行頭に引用記号"> "を挿入する
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
TextBox1.Text, _
"^", _
"> ", _
System.Text.RegularExpressions.RegexOptions.Multiline)
//行頭に引用記号"> "を挿入する
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
TextBox1.Text, "^", "> ",
System.Text.RegularExpressions.RegexOptions.Multiline);
次の例ではTextBox1に入力された文字列から連続する同じ行を削除しています。つまり、同じ内容の行が連続している場合、それを1行だけにします。ここで使用している正規表現パターンは、「Regular-Expressions.info」で紹介されているものです。
'連続する同じ行を削除
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _
TextBox1.Text, _
"^(.*)(\r?\n\1)+$", _
"$1", _
System.Text.RegularExpressions.RegexOptions.Multiline)
//連続する同じ行を削除
TextBox1.Text = System.Text.RegularExpressions.Regex.Replace(
TextBox1.Text,
@"^(.*)(\r?\n\1)+$",
"$1",
System.Text.RegularExpressions.RegexOptions.Multiline);
「2000/10/22」のように「/」で区切られている形式の日付を「2000年10月22日」と変更する例を示します。
'"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}日")
//"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デリゲートを使用すれば、もっと複雑な置換が可能です。
次の例では、日付の部分を1日増やした日付と置換しています。
'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
//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; } }