この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
前回投稿した半角/全角バリデータの正規表現の中身を解説します。前回は、rubyで使える半角/全角バリデータを紹介しました。
あのソースは突貫工事的に書いたものなので、実は自分でも仕組みを理解しないままでした。
ですが、「それじゃあいかん!」ってことで、1つずつ調べてみました。
以下、ソース再掲↓
KCODE = 'u'
def self.hankaku?(str)
return nil if str.nil?
# 半角のみOKなので、全角が混ざっているとfalseが返る
unless str.to_s =~ /^[ -~。-゚]*$/
return false
end
return true
end
def self.zenkaku?(str)
return nil if str.nil?
# 全角のみOKなので、半角が混ざっているとfalseが返る
unless str.to_s =~/^[^ -~。-゚]*$/
return false
end
return true
end
ポイントは
# 半角のみOKなので、全角が混ざっているとfalseが返る
unless str.to_s =~ /^[ -~。-゚]*$/
# 全角のみOKなので、半角が混ざっているとfalseが返る
unless str.to_s =~/^[^ -~。-゚]*$/
この2か所です。
正規表現を使っているだけですが、この正規表現がややこしい。
半角文字用の正規表現を1つずつ分解すると・・・
unless str.to_s =~ /先頭文字[ -~。-゚]0個以上の連続 終端文字/
となります。
つまり、[ -~。-゚]という文字の繰り返しってことです。
・・・で、これ[ -~。-゚]をさらに分解すると
" "から~まで & 。から゚まで
ようは、半角のスペースからチルダまで+句点から半濁点までってことです。
[0-9A-Z]と同じ感じで書いてあると思えば、そう難しくはないかと。
文字コードの並び順の関係で、この書き方でカタカナなどを含むすべての半角文字を指定することが可能です。
全角文字は、これを否定してやればOK。
これで、何をどういう感じで指定しているかがわかりました!
スッキリ☆