« VMWare Player に Scientific Linux 6.1 をインストールしてみた | トップページ | CentOS 6.2 がリリースされたとのこと »

2011/12/23

C#の正規表現でマッチ部分の置換を柔軟に行う方法



このエントリーをはてなブックマークに追加

Twilog to Evernote Converter」を作る際に、C# の正規表現でマッチした部分を、一律ではなく条件を加工して置換しようとしたら意外に苦労したので、その方法を載せておきます。

C# の正規表現で置換処理をするには、System.Text.RegularExpressions.Regex クラスの Replace メソッドを利用しますが、マッチした部分を一律に置換することは問題ありませんが、ちょっと加工しようと思うと途端に行き詰まります。

正規表現でマッチした部分を柔軟に加工するには、System.Text.RegularExpressions.MatchCollection クラスを利用します。

以下に実際に使用したコードの主要部分を載せますので参考にしてください。

・2011.12.24追記
同じ文字列がマッチした場合に正しく動作しない不具合を修正しました。

using System.Text.RegularExpressions;

private const string TWITTER_URI = "http://twitter.com/";

private string editTeet(string tweet)
{
    //URLの部分をリンクに一律で置換
    string work = Regex.Replace(tweet, 
            @"s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+", "<a href=\"$&\">$&</a>");

    //Twitter のユーザーID にマッチした部分を加工してリンクに置換
    Regex reg = new Regex(@"s?@[_a-zA-Z0-9]+");
    MatchCollection mc = reg.Matches(work);

    StringBuilder buf = new StringBuilder();
    int lastIndex = 0;

    foreach (Match item in mc)
    {
        buf.Append(work.Substring(lastIndex, item.Index - lastIndex));
        buf.Append("<a href=\"" + TWITTER_URI + item.Value.Substring(1)
                                                                + "\">" + item.Value + "</a>");
        lastIndex = item.Index + item.Length;
    }

    return buf.ToString() + work.Substring(lastIndex);
}


RSSリーダーへのご登録はこちらから!
Twitter のフォローは以下のボタンから!

スポンサード・リンク:

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/14182/43484737

この記事へのトラックバック一覧です: C#の正規表現でマッチ部分の置換を柔軟に行う方法:

コメント

コメントを書く

プロフィール

  • SE の fnya です。SE になって、はや10年以上。様々な言語で業務系システム開発や支援を行い、最近はセキュリティも(情報セキュリティスペシャリスト)。

    ブログについて

    このブログは、IT、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。

    >>プログ詳細
    >>自作ツール

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから