JavaScript で任意の漢字にマッチする正規表現を書く

重箱の隅で恐縮ですが。弾さんは

(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が参考資料代わりです。CJK Unified Ideographだけ欲しければ[\u4E00-\u9FFF]でも行けます。

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

とおっしゃってるけど、[\u4E00-\u9FFF] だと、追加漢字面の漢字にマッチしないわけで。

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

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

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

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

と書くべきなんじゃないかなーと思った。それとも、追加漢字面の一部に漢字以外のものが入ってたりするんだろうか。

壊れたサロゲートペアの取り扱い次第でセキュリティうんぬんという意見はあるのかもしれないけど、文字列のデコード/バリデート処理とそれを使う処理は明確に切り分けて設計すべき(されるべき)だし、実際に、ウェブラウザ上で動作する JavaScript については、文字コードのバリデーションはブラウザの仕事であって JavaScript プログラムの仕事ではない、というのがはっきりしているので、問題にならないはず。

7月24日追記: 追加漢字面以外のところで抜けがあったとのことで修正。id:mashabow さん、ありがとうございます。東京都最強うんぬん - しろもじメモランダム