技術とか戦略とか

SIerで証券レガシーシステムを8年いじってからSESに転職した業務系エンジニアによる技術ブログ。

一時的なエスケープ文字としてバイナリ文字を使う

ファイルで文字列置換を行う際、特定の条件を満たす文字を置換したくない場合があります。
例えば、CSVファイルの区切り文字であるカンマをタブ文字に置換したい場合、文字列項目中に出現する区切り文字ではないカンマ、具体的に言うと""で囲まれた箇所のカンマは置換したくない場合があります。
その場合、置換したくないカンマを一時的にエスケープ文字に入れ替えた後、カンマを一括置換し、エスケープ文字を元の文字に戻すと、上手く置換できます。
 
例えば、以下のレコードをサクラエディタで置換したい場合、
5,"詰め合わせセット(ジュース,お菓子)",1000
正規表現をONにして以下のように置換すると上手くいきます。
 
置換前 ("[^,]*),([^,]*")
置換後 ${1}@${2}

置換前 ,
置換後 \t

置換前 @
置換後 ,
 
ここで、エスケープ文字としてどのような文字を使うかが問題になります。
上記の例では@をエスケープ文字としていましたが、ファイル中に@の文字が出現する場合、エスケープ文字をカンマに戻す際にその文字も一緒にカンマに置換されてしまいます。
これを回避するために、エスケープ文字として、通常入力されることがない文字を使用することが有効になります。
サクラエディタでは\x{01}のように指定すると16進コードで文字を指定できるため、これを利用して、キーボードから入力することが困難な文字を置換で指定することができます。
 
通常入力されることがないエスケープ文字として、以下の文字を使うことをお勧めします。
何れも、ASCIIコードで定義された現在では使われることが考えにくい制御文字であり、かつカナ拡張されたIBMEBCDICでも使われることがない文字です。
バイナリ文字が埋め込まれたファイルであったり、特殊な仕様が存在するファイルであったりしない限りは、使われる心配はしなくて良いでしょう。
 
・\x{01}~\x{08}
・\x{0b}~\x{0c}
・\x{0e}~\x{1f}