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{|}~"