Perlの正規表現で制御文字を削除する
Perlの正規表現で制御文字を削除する方法を紹介します。
1.経緯
会社で使っている自作ツール(Perl)があります。
そのツールは、設計書のレビュー時にコメントで質問・回答のやりとりをするというもので、コメントの一覧をテーブル形式で表示することもできます。
ある日、その一覧が途中までしか表示されなくなりました。表示されなくなった境界のデータを確認してみると、「♂」を半角にしたような、みなれない制御文字が含まれていました。
コメントを投入した人に確認してみると、「パワーポイントのふきだしオブジェクトに入力されたテキストをコピー&ペーストした」ということです。
コメントはXML形式で保存し、一覧表示するときはXML::Simpleを使ってデータをパースしているのですが、制御文字が原因で正常にパースできなかったようです。
ということで、次項に制御文字を削除する方法を紹介します。
2.制御文字を削除する
制御文字の削除には、正規表現の「POSIXキャラクタクラス」というものを使います。制御文字の正規表現は次のとおりです。
[:cntrl:]
実際に利用するときにはブラケットを二重にして
[[:cntrl:]]
とします。これをs演算子(置換演算子)に設定して、
$data =~ s/[[:cntrl:]]//g;
とすることで、制御文字が削除できるようです。
3.タブと改行以外の制御文字を削除する
2項の方法ではタブや改行も削除されてしまうので、「否定先読み」を使い、タブと改行以外の制御文字を削除するようにします。
最終的には次のようになります。
$data =~ s/(?![\n\t])[[:cntrl:]]//g;
4.参考サイト
参考サイトは下記です。ありがとうございました。
Posted by yujiro このページの先頭に戻る
- Perlの正規表現で文字列マッチを繰り返し判定する方法
- Perlの正規表現で条件分岐する方法
- 正規表現の最短マッチと最長マッチについて
- Perlの正規表現で繰り返し置換する方法
- Perlの正規表現で複数行にマッチさせる方法
トラックバックURL
コメントする
greeting