文章中の「括弧(かっこ)」のようなふりがな表記をrubyタグに置換
たとえば、こんな文章があって、
次〔つぎ〕の ( ) に入〔い〕れるのに最〔もっと〕も適切〔てきせつ〕なものを一〔ひと〕つ選〔えら〕び,その番号〔ばんごう〕を答〔こた〕えなさい。
その中の「括弧(かっこ)」のような箇所がふりがなになるという指定だとする。
該当箇所を以下のようなHTML5の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>を<ruby>答<rt>こた</rt></ruby>えなさい。
表示はこうなる。
次の ( ) に入れるのに最も適切なものを一つ選び,その番号を答えなさい。
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