Tana Gone
Tana Gone
1 min read

Categories

Rubyの正規表現は鬼雲(Onigmo)C言語ライブラリで実現されており最新版は2019-01リリースのものである。鬼雲は鬼車からフォークされいる。鬼車はフォーク後も開発が2025年まで継続されるも現在では開発中止が宣言されている。 OnigumoではUnicodeプロパティ(Unicode character property)を使うことが出来る。どういうことかというと、このプロパティLetterを使えば/\p{Letter}+/といったパターンマッチが可能なのだ。 note: Ruby3.xは2020 ‐ 2024年に年に1回リリースされた。xの部分は西暦の1桁目と一致。

このプロパティのリストはOnigumoのGitHub Repoにありdoc/UnicodeProps.txtがそれである。この文書を見ると次のカテゴリーに分類されている。プロパティにはどの様なものがあり各々どの様なコードポイントが含まれるのかを知りたいところだが、これが容易ではない。

  • POSIX brackets
  • Special
  • Major and General Categories
  • Scripts
  • DerivedCoreProperties
  • PropList
  • Emoji
  • PropertyAliases
  • PropertyValueAliases (General_Category)
  • PropertyValueAliases (Script)
  • DerivedAges
  • Blocks

Wikipedia.enでUnicode character propertyを検索すると付属文書#44に詳細があるのだが、#44を起点に更に辿って行かないと詳細には辿り着かない。

そこで試行錯誤によりこのプロパティを使ってみる。

str = "漢字あaABc123パターンDEF123"
m = str.scan /\p{Letter}+/
=> ["漢字あaABc", "パターンDEF"]

m = str.scan /\p{In_Halfwidth_and_Fullwidth_Forms}+/
=> ["ABc", "DEF123"]

m = str.scan /[\p{Letter}\p{In_Halfwidth_and_Fullwidth_Forms}]+/
=> ["漢字あaABc", "パターンDEF123"]

m = str.scan /[\p{Han}]+/
=> ["漢字"]

m = str.scan /[\p{In_Katakana}]+/
=> ["パターン"]

m = str.scan /[\p{Katakana}]+/
=> ["パタ", "ン"]

m = str.scan /[\p{Nd}]+/
=> ["123", "123"]

役物

str = "グリーンエナジー&カンパニー"
m = str.scan /[\p{Po}]+/
=> ["&"]

m = str.scan /[\p{Lo}]+/
=> ["グリ", "ンエナジ", "カンパニ"]

m = str.scan /[\p{Common}]+/
=> ["ー", "ー&", "ー"]

m = str.scan /[\p{Common}\p{Letter}]+/
=> ["グリーンエナジー&カンパニー"]

役物2

str = "Lib Work"
m = str.scan /[\p{Common}\p{Letter}]+/
=> ["Lib Work"]

全角スペース Commonは便利なのだが半角スペースで区切られた2つの会社名を含む文字列から会社名を取り出せない。全角スペース\u3000を使わないと全角スペースを含む会社名も取り出せない。役物を含む会社名はPo = Punctuation Otherプロパティを使えば取り出せる。

str = "Lib Work 富士ピー・エス グリーンエナジー&カンパニー"
m = str.scan /[\p{Po}\p{Letter}\u3000]+/
=> ["Lib Work", "富士ピー・エス", "グリーンエナジー&カンパニー"]

m = str.scan /[\p{Po}\p{Letter}]+/
=> ["Lib", "Work", "富士ピー・エス", "グリーンエナジー&カンパニー"]

m = str.scan /[\p{Common}\p{Letter}]+/
=> ["Lib Work 富士ピー・エス グリーンエナジー&カンパニー"]

Commonプロパティに含まれる文字を紹介して下さい Common(スクリプト名: Zyyyは、特定の言語や文字体系(ラテン文字、ひらがな、漢字など)に限定されず、「複数の言語やシステムで共通して使われる文字や記号」が分類されるUnicodeプロパティです。 [1]

このプロパティには、私たちが日常的に目にする記号やスペース、数字の多くが含まれています。代表的な文字のカテゴリーと具体例は以下の通りです。 [1, 2]

  1. 句読点・区切り文字 (Punctuation)

文章の構造を作るための記号は、言語を問わず使われるため Common に分類されます。 [1]

  • 半角記号: ,(カンマ)、.(ピリオド)、?(疑問符)、!(感嘆符)、:(コロン)、;(セミコロン)
  • 全角記号: (読点)、(句点)、(全角疑問符)、(全角感嘆符)
  • 括弧(かっこ)類: ()[]{}「」『』【】() [1]
  1. 算術演算子・数学記号 (Symbols)

世界共通で使われる数式用の記号です。

  • 演算子: +(プラス)、×(乗算)、÷(除算)、=(等号)、<(不等号)、(平方根)
  • その他: (無限大)、%(パーセント)、(パーミル)
  • ※注意: -(マイナス/ハイフン)も Common です。
  1. 空白文字 (Separators / Whitespace)

文字と文字の間を空けるためのスペース全般です。 [1, 2, 3]

  • 半角スペースU+0020
  • 全角スペースU+3000
  • その他、タブ文字や各種制御用の特殊なスペース
  1. 通貨記号 (Currency Symbols)

各国の通貨を表す記号の多くが該当します。

  • ¥(円記号)、$(ドル記号)、(ユーロ記号)、£(ポンド記号)、(ウォン記号) [1]
  1. 一般的な記号・アイコン (Miscellaneous Symbols)
  • 日常の記号: &(アンパサンド)、@(アットマーク)、*(アスタリスク)、#(シャープ/ハッシュ)、§(セクション)
  • 全角の記号: (米印)、(郵便番号マーク)
  • 矢印:
  • 絵文字(Emoji)の一部: 多くの絵文字も特定の言語に属さないため Common に分類されます。 [1]
  1. アラビア数字 (Digits)

世界中で使われる 0 から 9 までの数字、およびその全角文字です。

  • 半角数字: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • 全角数字: , , , , , , , , ,
  • ※ローマ数字(Ⅰ, Ⅱなど)も Common に含まれます。 [1, 2]