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);
}


スポンサーリンク


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




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

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

    現在、Enty で支援を受け付けています。もしよければご支援ください。



    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

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