- blogs:
- cles::blog
2009/06/30

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


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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112094)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110735)
3 . 年次の人間ドックへ(110338)
4 . 2023 年分の確定申告完了!(1つめ)(109890)
5 . 三菱鉛筆がラミーを買収(109790)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110735)
3 . 年次の人間ドックへ(110338)
4 . 2023 年分の確定申告完了!(1つめ)(109890)
5 . 三菱鉛筆がラミーを買収(109790)
cles::blogについて
Referrers