BLOGTIMES
2009/06/30

正規表現で制御文字をフィルタする

  ruby  regex 
このエントリーをはてなブックマークに追加

Rubyでテキストファイルを大量に処理するプログラムを書いているのですが、元データの関係で文字列中に制御文字が入ってしまっていて、それが後続の処理に影響を及ぼしてしまうことがわかったので、正規表現を使って下記のような処理を書いてみました。

00.chr+"hoge" # => "\000hoge" (00.chr+"hoge").gsub(/[[:cntrl:]]/,"") # => "hoge"

ところが、このままだと制御文字が無条件に取り除かれてしまうので改行もなくなってしまいます。

"hoge\nhoge".gsub(/[[:cntrl:]]/,"") # => "hogehoge"

なんとか、改行だけ生かしたまま他の制御文字だけ取り除けないかなぁとおもってマニュアルを探してみると、否定先読みという機能を使うときれいに解けそうということが分かりました。

正規表現 - Rubyリファレンスマニュアル

否定先読み(negative lookahead)。パターンの否定による位置指定(幅を持たない)
(?!re1)re2
という表現は、re1 にマッチしないが re2 にはマッチする正規表現です。

これを参考に下記のような正規表現を書いてみると、うまく動く事が確認できました。

(00.chr+"hoge\nhoge").gsub(/(?!\n)[[:cntrl:]]/,"") # => "hoge\nhoge"

正規表現の先読み系は使い方が良くわからなくてこれまで使った事がなかったのですが、このあたりも使いこなせるようになると正規表現はますます強力な武器になりそうです。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3098
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン