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]
- 句読点・区切り文字 (Punctuation)
文章の構造を作るための記号は、言語を問わず使われるため Common に分類されます。 [1]
- 半角記号:
,(カンマ)、.(ピリオド)、?(疑問符)、!(感嘆符)、:(コロン)、;(セミコロン) - 全角記号:
、(読点)、。(句点)、?(全角疑問符)、!(全角感嘆符) - 括弧(かっこ)類:
()、[]、{}、「」、『』、【】、()[1]
- 算術演算子・数学記号 (Symbols)
世界共通で使われる数式用の記号です。
- 演算子:
+(プラス)、×(乗算)、÷(除算)、=(等号)、<(不等号)、√(平方根) - その他:
∞(無限大)、%(パーセント)、‰(パーミル) - ※注意:
-(マイナス/ハイフン)もCommonです。
- 空白文字 (Separators / Whitespace)
文字と文字の間を空けるためのスペース全般です。 [1, 2, 3]
- 半角スペース(
U+0020) - 全角スペース(
U+3000) - その他、タブ文字や各種制御用の特殊なスペース
- 通貨記号 (Currency Symbols)
各国の通貨を表す記号の多くが該当します。
¥(円記号)、$(ドル記号)、€(ユーロ記号)、£(ポンド記号)、₩(ウォン記号) [1]
- 一般的な記号・アイコン (Miscellaneous Symbols)
- 日常の記号:
&(アンパサンド)、@(アットマーク)、*(アスタリスク)、#(シャープ/ハッシュ)、§(セクション) - 全角の記号:
&、@、※(米印)、〒(郵便番号マーク) - 矢印:
←、↑、→、↓ - 絵文字(Emoji)の一部: 多くの絵文字も特定の言語に属さないため
Commonに分類されます。 [1]
- アラビア数字 (Digits)
世界中で使われる 0 から 9 までの数字、およびその全角文字です。
