rhanda | 元銀行員Web系エンジニアの日記

実務未経験からWeb系受託開発企業に転職したひよっこエンジニアが覚えたことや日々の感情を残すブログ

Rubyの正規表現で ASCII印刷可能文字を表現する


range を使ってできました。

(' '..'~').to_a.join
# => " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"


使用できる文字をASCIIの0x20から0x7Eまで(半角空白を含む半角英数記号)に制限したいことがありました。

ググっても目ぼしい情報を見つけられず手で直接書いていたのですが、 抜け漏れがないかどうかの検証も難しく、 なんとか機械的にできないものかと考えていたところ、この書き方を教えてもらってとても便利🥺と思いました。

メタ文字をエスケープして期待通り使用できました。

> ASCII_PRINTABLE_CHARS = (' '..'~').to_a.join

> /\A[#{Regexp.escape(ASCII_PRINTABLE_CHARS)}]+\z/
# => /\A[\ !"\#\$%&'\(\)\*\+,\-\.\/0123456789:;<=>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_`abcdefghijklmnopqrstuvwxyz\{\|\}~]+\z/


感想

文字コードを使っているんだもんなあと後になって強く感じました。

("0x20".to_i(16).chr.."0x7E".to_i(16).chr).to_a.join
=> " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"