しろもじメモランダム

文字についてあれこれと。

東京都最強うんぬん

重箱の隅。

(function(e){ 
  e.innerHTML = e.innerHTML.replace( 
    /東京都?([\u3200-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]+)/g, 
    '首都$1東京' 
  ) 
})(document.body) 

漢字を判定する正規表現が工夫のしどころでしょうか。[一-龠]はUnicode時代にはちょっと古い。grep CJK /usr/local/lib/perl5/5.10.0/unicore/Blocks.txtが参考資料代わりです。

404 Blog Not Found:javascript+regexp - ていうか首都最強東京bookmarklet

\u3200-\u4DBF とあるけど、U+3200-32FF は Enclosed CJK Letters and Months、U+3300-33FF は CJK Compatibility なので、漢字以外の「東京㈱㊙」や「東京㌨㍍」なんかも「首都㈱㊙東京」や「首都㌨㍍東京」になってしまう。正確には \u3400-\u4DBF。

(…略…) [\u4E00-\u9FFF] だと、追加漢字面の漢字にマッチしないわけで。

漢字1文字にマッチさせる場合は、

[\u4E00-\u9FFF]|[\uD840-\uD87F][\uDC00-\uDFFF] 

複数文字にマッチさせる場合は、

[\u4E00-\u9FFF\uD840-\uD87F\uDC00-\uDFFF]+ 

と書くべきなんじゃないかなーと思った。

JavaScript で任意の漢字にマッチする正規表現を書く - kazuhoのメモ置き場

これならSIPもカバーするけど、逆にBMPの拡張A(U+3400-4DBF)と互換漢字(U+F900-FAFF)が抜けてしまっているので、

[\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]
[\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840-\uD87F\uDC00-\uDFFF]+

とでもすりゃいいんじゃないでしょうか。よく知らんけど。