すらいむがあらわれた

こまんど >  たたかう  にげる

文章中の「括弧(かっこ)」のようなふりがな表記をrubyタグに置換

たとえば、こんな文章があって、

次〔つぎ〕の ( ) に入〔い〕れるのに最〔もっと〕も適切〔てきせつ〕なものを一〔ひと〕つ選〔えら〕び,その番号〔ばんごう〕を答〔こた〕えなさい。

その中の「括弧(かっこ)」のような箇所がふりがなになるという指定だとする。
該当箇所を以下のようなHTML5rubyタグに置換したい。

<ruby><rt>つぎ</rt></ruby>の (        ) に<ruby><rt></rt></ruby>れるのに
<ruby><rt>もっと</rt></ruby><ruby>適切<rt>てきせつ</rt></ruby>なものを
<ruby><rt>ひと</rt></ruby><ruby><rt>えら</rt></ruby>び,
その<ruby>番号<rt>ばんごう</rt></ruby><ruby><rt>こた</rt></ruby>えなさい。

表示はこうなる。

つぎの ( ) にれるのにもっと適切てきせつなものをひとえらび,その番号ばんごうこたえなさい。

C#Regexで置換する。

string replaced = Regex.Replace(original, @"(?<=^|[\p{IsHiragana}|\p{IsKatakana}])(\p{IsCJKUnifiedIdeographs}+?)〔(.+?)〕",
                            delegate(Match m)
                            {

                                string ret = m.Value;
                                ret = ret.Replace(m.Value, "<ruby>" + m.Groups[1].Value + "<rt>" + m.Groups[2].Value + "</rt></ruby>");

                                return ret;

                            });

これは、左側に漢字かひらがながあるときだけ'漢字〔ひらがな〕'のパターンをrubyタグに置換する、という処理をしている。


正規表現の中の
\p{IsHiragana}
は「名前付きブロック」というもので、上記のような書き方で[\u3040-\u309F]を指定するのと同じ効果がある。


上記で使っているのはこれ。

IsHiragana 3040 〜 309F ひらがな
IsKatakana 30A0 〜 30FF カタカナ
IsCJKUnifiedIdeographs 4E00 〜 9FFF 漢字


参考にしたリンク。
@IT .NET TIPS 文字列のひらがな/カタカナをチェックするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/054iskana/iskana.html

MSDN 正規表現での文字クラス
http://msdn.microsoft.com/ja-jp/library/20bw873z(v=vs.110).aspx