プレーンテキストであることを確認するための正規表現


Perlのプログラムにて、あるファイルがプレーンテキストのみで書かれていることを  
正規表現で判別したいのですが、どのようにパターンを書けば実現出来るか悩んでいます。  
Linuxのfileコマンドでテキスト/バイナリの識別ができますが、  
そのようなことを正規表現で書けるものでしょうか。




「プレーンテキスト」の定義が「表示可能な文字データだけを含む」であるとするならば、`\p{Print}` で充分かもしれません。`Print`
が何者かはマニュアル `perluniprops`(1) を参照のこと。

例えば入力の文字エンコーディングが UTF-8 とするなら、次のようになります。

[code]

    $ perl -MEncode -e '$/=""; $i=<>; eval { $i=Encode::decode("UTF-8", $i, Encode::FB_CROAK); }; print(((!$@ && $i!~/[^\p{Print}\t\n]/) ? "Text" : "Binary"), "\n")' /etc/passwd
    Text
    $ perl -MEncode -e '$/=""; $i=<>; eval { $i=Encode::decode("UTF-8", $i, Encode::FB_CROAK); }; print(((!$@ && $i!~/[^\p{Print}\t\n]/) ? "Text" : "Binary"), "\n")' /bin/ls
    Binary
    
[/code]

評価対象の変数の UTF8 フラグを立ること (`perlunitut`(1) や `Encode` モジュールのマニュアル (`perldoc
Encode` を実行すると読めます) を参照)、改行コードとタブもテキストと識別したいなら正規表現の文字クラスに `\t\n`
を含める点が重要です。`\r` も含めることも検討してください。

入力が Shift_JIS ならば `Encode::decode` の第一引数を調整してください。

[code]

    $ perl -MEncode -e '$/=""; $i=<>; eval { $i=Encode::decode("Shift_JIS", $i, Encode::FB_CROAK); }; print(((!$@ && $i!~/[^\p{Print}\t\n]/) ? "Text" : "Binary"), "\n")' sjis.txt
    Text
    
[/code]

