Ruby で文字列内から制御文字を削除するサンプルコード。正規表現で制御文字を削っている。


$ cat metachars.rb

metachars = {
  "tab        " => "\t",
  "newline    " => "\n",
  "back space " => "\b"
}

puts('そのまま出力(制御文字を削除しない)')
metachars.each{|key,val|
  puts("#{key}: AAA#{val}BBB")
}
puts('')

puts('正規表現でPOSIX文字クラスを使って制御文字を削除')
metachars.each{|key,val|
  puts("#{key}: AAA#{val}BBB".gsub(/[[:cntrl:]]/, ''))
}
puts('')

puts('正規表現で否定先読みを使ってタブと改行以外の制御文字を削除')
metachars.each{|key,val|
  puts("#{key}: AAA#{val}BBB".gsub(/(?!(\t|\n))[[:cntrl:]]/, ''))
}
puts('')

実行結果。


$ ruby metachars.rb
そのまま出力(制御文字を削除しない)
tab        : AAA        BBB
newline    : AAA
BBB
back space : AABBB

正規表現でPOSIX文字クラスを使って制御文字を削除
tab        : AAABBB
newline    : AAABBB
back space : AAABBB

正規表現で否定先読みを使ってタブと改行以外の制御文字を削除
tab        : AAA        BBB
newline    : AAA
BBB
back space : AAABBB

バックスペースの制御文字を野放しにすると、文字列を連結したときに前の文字を削ってしまう。外部からの入力でこんなのがあったら危険なので、必要に応じて削除する必要がある。

今回の環境: Debian GNU/Linux jessie + Ruby 2.1


$ uname -mrsv
Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-1 (2016-03-06) x86_64

$ ruby -v
ruby 2.1.5p273 (2014-11-13) [x86_64-linux-gnu]
コンピューティングと電気通信において、制御文字(せいぎょもじ、英語: control character)とは、文字コードの規格で定義される文字のうち、ディスプレイ・プリンター・通信装置などに対して、特別な動作(制御)をさせるために使う文字である。制御キャラクタともいい、情報処理用語規格では「制御機能文字」と呼ばれている。

制御文字 - Wikipedia
正規表現内では、「\」の後に文字列を置くことで、 ある特定の文字を表現することができます。 これは、改行のように Ruby の文法で特別な意味を持つ文字を埋め込む ためなどに用いられます。 文字列リテラルの記法とほぼ同様(リテラル/バックスラッシュ記法)で、 以下の記法が利用可能です。

\t 水平タブ horizontal tab (0x09)
\v 垂直タブ vertical tab (0x0B)
\n 改行 newline (0x0A)
\r 復帰 return (0x0D)
\b バックスペース back space (0x08)
\f 改ページ form feed (0x0C)
\a ベル bell (0x07)
\e エスケープ文字 escape (0x1B)
\nnn 符号化バイト値の8進数表現 (nnn の8進数3文字で表現)
\xHH 符号化バイト値の16進数表現 (HH の16進数2文字で表現)
\cx, \C-x 制御文字 (x は a から z までのいずれかの文字)
\M-x メタ (x|0x80)
\M-\C-x メタ制御文字
\uHHHH ユニコード文字 (HHHH の16進数4桁)
\u{HHHHHH HHHHHH ....} ユニコード文字列 (HHHHHH は16進数1桁から6桁まで指定可能)

正規表現 (Ruby 2.1.0)

tags: ruby

Posted by NI-Lab. (@nilab)