📚

[Bug #2150] \p{Word} と \p{Join_Control} の違いに関するバグ報告

に公開

[Bug #2150] \p{Word} does not match on \p{Join_Control} while docs say it does

  • ドキュメントでは \p{Word}\p{Join_Control} は同じと書いてあるが、同じでないケースがあるというバグ報告
  • ここでいうドキュメントとは Ruby ではなくて Unicode の方
  • UTS #18: Unicode Regular Expressions
    • 以下のように "\u200D" の場合、 \p{Word} はマッチしないが \p{Join_Control} はマッチする
pp "\u200D" =~ /\p{Word}/u           # => nil
pp "\u200D" =~ /\p{Join_Control}/u   # => 0
  • \u200D はゼロ幅接合子
  • 複数の文字を結合するための特別な文字
  • ゼロ幅接合子 - Wikipedia
  • \p{Join_Control}
  • 筆記体の結合と結紮を制御するための特定の機能を持つ書式制御文字
  • UAX #44: Unicode Character Database
    • \p{Word}
  • \p{M}\p{Nd}\p{Pc}\p{Alpha}\p{Join_Control} と同等の Unicode プロパティ
  • なので \p{Join_Control} でマッチするのであれば \p{Word} でもマッチするのが期待する挙動になる
  • これなんですが2年以上前に修正PRは出されていたんですが長らくマージされていなかったようで、このPRがマージされて最新版の Ruby 3.5-dev では意図する挙動になるようになった
  • [Bug #19417] Make word prop match join_control ... by jaynetics · Pull Request #7711 · ruby/ruby
pp "\u200D" =~ /\p{Word}/u
# Ruby 3.4 => nil
# Ruby 3.5 => 0

pp "\u200D" =~ /\p{Join_Control}/u
# Ruby 3.4 => 0
# Ruby 3.5 => 0
GitHubで編集を提案

Discussion