2011年9月30日金曜日

FINDSTRコマンドで正規表現を使う時の注意点 - Windowsのコマンドプロンプト(bat,cmd)

WindowsコマンドのFINDSTR
○Windows XP
FINDSTRコマンドで正規表現を使う時、予想外の動きをするパターンがありましたので、メモします。

o 問題となるパターンは、[abc] の形の正規表現(= [a-c] や [^abc]も)
    + 括弧内はバイト単位で比較します。全角半角混在の時に問題になります。
    + [a-c] を評価する時に、半角文字をaAbBcC の順で調べます。
o 確認した文字は 日本語(= Windows版の Shift-JIS = コードページ 932)
o 確認したOSは Windows XP Service Pack 3 です。


**** 注意点
o [abc] の形の正規表現は、括弧の中に書かれていない文字がヒットする場合があります。
    + (= [a-c] や [^abc]も同様です)
o 問題となるパターンの例
--------
findstr "[ABC]" mikusan.txt
findstr "[a-c]" mikusan.txt
findstr "[^abc]" mikusan.txt
--------

    + "[ABC]" パターンで半角文字を検索すると、全角文字がヒットする事があります。
        + ファイルの中の全角文字の2バイト目が、半角文字の文字コードと一致すると起こります。
    + 逆に、"[アイウ]" パターンで全角文字を検索すると、半角文字がヒットする事があります。
        + 例えば、"[アイウ]" で検索すると、半角文字「A」「C」がヒットします。
        + ファイルの中の半角文字の文字コードが、全角文字の2バイト目と一致すると起こります。
    + "[A-C]" パターンで大文字の半角文字を検索すると、上記に加えて一部の小文字がヒットします。
        + 例えば、"[A-C]" で検索すると、小文字の「b」と「c」もヒットします。
    + (小文字の "[a-c]" パターンの時は、一部の大文字がヒットします。)


**** 原因(推定)
o このコマンドは、[abc] 内の半角文字を比較する時に、aAbBcC の順で調べているみたいです。
    + ですので、[A-C] を指定すると、「b」「c」を含む行もヒットします。
o また、このコマンドは、正規表現 [abc] を検索する時に、バイト単位で文字比較しています。
    + 半角文字の検索では、2バイト目に半角文字と同じコードを含む全角文字もヒットします。
    + 全角文字の検索では、全角文字の2バイト目と同じコードを持つ半角文字もヒットします。


**** 問題となった例
o [abc] の形の正規表現
    + [ABC] を指定すると、「A」「B」「C」の他に、カナの「ア」「イ」「ィ」もヒットしました。
    + [A-C] を指定すると、「A」「B」「C」の他に、小文字の「b」「c」カナの「ア」「イ」「ィ」もヒットしました。
    + [a-c] を指定すると、「a」「b」「c」の他に、大文字の「A」「B」カナの「ア」「ィ」もヒットしました。
    + [ア] を指定すると、「ア」の他に、大文字の「A」もヒットしました。

-------- コマンドの例
findstr "[a-c]" mikusan.txt
--------



**** メモ
o この現象を回避したい時は、問題となる部分を他のプログラムに任せてしまう方法がおすすめです。
    + 私の場合は、バッチファイルから ▼AWK を呼び出しています。


**** 確認したバージョン
o Windows XP Service Pack 3 + Windows Update 2011年9月版


==
関連ページ:
    ▼FINDSTR = ファイルの中を正規表現、もしくは文字列で検索する。OR検索可能版
    ▼Windowsコマンド。ファイルとフォルダー関連▼ABC順
    ▼Windowsコマンド一覧▼ABC順
    ▼コマンドプロンプト画面
    > FC = ファイルの内容を比較して、それらの違いを表示する
(2011年11月10日追加。メモ欄)
(2011年10月14日変更。冒頭に問題点まとめを追加)
(2011年10月1日変更。問題となるパターンの例を下に移動)