ASCII以外のアルファベットの「\w」
ツール向けに参加選手情報をリプする[twitter:@tdfmembers]というアカウントを運用(ただし途中で停止)していました。
そうすると、英語圏以外の選手の表記はアルファベット26文字で済まないことに気付きます。é や â などのダイアクリティカルマークが付くアルファベットを用いて表記していることがあるのです。
となると、困るのが、上記アカウントにリプされた内容から名前表現を切り出すときに、名前を表す正規表現が/[\w\s-]+/で済まない点です。
結論から書くと
/[\p{Latin}\s-]+/
と書くのですよね。
んじゃ\p{Latin}って何だ、と言うことになります。\p{なんたら}という表記でUnicodeのある文字集合を示すらしいです。「なんたら」のリストは
- Ruby 1.9(Oniguruma)
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
- Ruby 2.0以上(Onigumo)
https://raw.githubusercontent.com/k-takata/Onigmo/master/doc/UnicodeProps.txt
に載っています。
さらなる詳細については省きます(いずれ書きたいのですが)。詳しいサイトへのリンクだけ張っておきます。
- [連載:正規表現] Unicode文字プロパティについて(2) ― Pの一族 | TechRacho
- [連載:正規表現] Unicode文字プロパティについて (3) 文字プロパティとは | TechRacho
るりまの正規表現も張っておきます。(なお、リンクはRuby 1.9.3のものです。1.9.3 だとエンジンが Oniguruma なのに、説明が 2.0 以降で使われている Onigumo なのが不満です)。
あと、本家の「なんたら」リスト。
http://www.unicode.org/Public/UNIDATA/PropList.txt
ASCII以外のアルファベットの「String#upcase / String#downcase」
残念ながら upcase/downcase メソッドはアルファベット26文字にしか利きません。
"é".upcase #=> "é" #"É"を返してほしいのに…
探すと、 Unicode で upcase/downcase などを扱うためのgemがありました。
ひとまずややこしいことは置いておきます。いまは upcase/downcase だけ扱うことにします。
試しに上記の é を É に出来るか確認します。
require "unicode_utils/upcase" UnicodeUtils.upcase("é") #=> "É"
できましたね^^。
マニュアルの該当部分を引用しておきます。
このgemがその他にどのようなことが出来るかというと、以下のような感じです。
Module: UnicodeUtils
UnicodeUtils.upcase full conversion to uppercase UnicodeUtils.downcase full conversion to lowercase UnicodeUtils.titlecase full conversion to titlecase UnicodeUtils.casefold case folding (case insensitive string comparison) UnicodeUtils.nfd Normalization Form D UnicodeUtils.nfc Normalization Form C UnicodeUtils.nfkd Normalization Form KD UnicodeUtils.nfkc Normalization Form KC UnicodeUtils.each_grapheme grapheme boundaries UnicodeUtils.each_word word boundaries UnicodeUtils.char_name character names UnicodeUtils.grep find code points by character name
細かくはお調べくださいませ(人任せでスミマセン)。