created: 2020-08-03T01:19:16.000Z

jsでマルチバイト文字にあてる正規表現はuフラグをつける

理由

  • jsの文字列は内部でUTF-16を使っている
  • jsで文字列の1文字は1つのコードユニットを指し、コードポイントを指すわけではない

👶🏼.lengthはJSだと4である

> const baby = "👶🏼"
undefined
> baby.length
4

なので以下の「4文字」という正規表現にマッチしてしまう

> baby.match(/^.{4}$/)
[ '👶🏼', index: 0, input: '👶🏼', groups: undefined ]

これを避けるためには(👶🏼を1文字として扱うためには) 正規表現にuフラグをつける

> baby.match(/^.{4}$/u)
null

参考

基本的には正規表現にuフラグをつけて問題となるケースは少ないはずです。 なぜなら、サロゲートペアの片方だけにマッチしたい正規表現を書くケースはまれであるためです。

その他

例にあげた 👶🏼 だと異体字セレクタの話が混ざってるのでそれはまた今度

Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考
[ad] Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考
Tom Long, 秋勇紀 (単行本(ソフトカバー))