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

その他

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