犬ぶよツールズ制作記録

Javaによる研究生活のためのパッケージ、犬ぶよツールズ。
その開発と保守のための備忘録

テキストファイル用の正規表現によるフィルタ

2007-09-17 17:32:26 | Weblog
テキストファイル用のフィルタで、
設定ファイルに書かれた正規表現にマッチするものを置換するものを作った。
ここでは、その仕様をメモする。

● 本体:RegrexTextFilter

使い方
> java RegrexTextFilter -c config.xml input.txt output.txt

-c オプションで設定ファイルを指定します。
その後に置換したいテキストファイルの名前、
出力を書き出すファイルの名前を指定します。

● 動作
1. ファイルの先頭に文字列を書き加える
2. ファイルの内部の文字列を置換する
3. ファイルの末尾に文字列を書き加える

● 設定ファイル
○ XMLで書く。
+ <regrex></regrex>タグ
ルートにする。

+ <start></start>タグ
ファイルの先頭に書き加える文字列を表す。
書き加える文字列は<line />タグを使って書く。
このタグは<regrex></regrex>の要素として用いる。

+ <end></end>タグ
ファイルの末尾に書き加える文字列を表す。
書き加える文字列は<line />タグを使って書く。
このタグは<regrex></regrex>の要素として用いる。

+ <line />タグ
書き加える文字列を表す。
文字列はvalue属性として与える。
このタグは<start></start>、<end></end>の要素として用いる。

+ <replace />タグ
置換する文字列についての情報を表す。
before属性にマッチに用いる正規表現を与える。
after属性に置換後の文字列を与える。
before属性とafter属性の両方がそろっている場合のみ
このタグは有効とみなされて置換が行われる。
このタグは<regrex></regrex>の要素として用いる。

○ 例
ファイルの先頭に"犬を猫に変えました"という行と
"ポチをタマに変えました"という行を追加し、
ファイル内の"犬"という文字を"猫"に、
ファイル内の"ポチ"という文字を"タマ"に置換し、
ファイルの末尾に"終わり"という行を追加する場合、
以下のようになる。

<?xml version="1.0" encoding="UTF-8" ?>
<regrex>
<start>
<line value="犬を猫に変えました" />
<line value="ポチをタマに変えました" />
</start>
<end>
<line value="終わり" />
</end>
<replace before="犬" after="猫" />
<replace before="ポチ" after="タマ" />
</regrex>

● 正規表現について

○ <replace />タグのbefore属性に与えられた文字列は、
Javaの正規表現として扱われる。
実際には次のようなコードが置換を行う。

String line, before, after;
...
line = line.replaceAll(before, after);

ここで、lineは置換されるファイルのある1行、
beforeはbefore属性で与えられた正規表現の文字列、
afterはafter属性であたえられた文字列を表す。

Javaの正規表現は例えば次のサイトにまとめられている。
http://www.hellohiro.com/regex.htm

○ 置換した結果をafter属性で参照するには$0, $1, $2 , ...を使う。
$0はマッチした文字列全体を表す。
$1, $2などは、マッチした文字列の中のグループを表す。

○ <replace />タグの例

+ 行頭の"犬"または"猫"だけを選んで"{"と"}"で囲む。
<replace before="^(犬|猫)" after="{$1}" />

+ 行頭に"犬"または"猫"がある行だけを選んで"{"と"}"で囲む。
<replace before="^(犬|猫)(.*)$" after="{$0}" />

● XML内での文字の書き換え
属性内では文字"、文字<は使えず、それぞれ&quot;、&lt;と書かなければならない。

○ <replace />タグの例

+ "犬"または"猫"だけを選んで"<i>"と"</i>"で囲む。
<replace before="(犬|猫)" after="&lt;i>$1&lt;/i>" />

+ 2重引用符で囲まれた"犬"または"猫"だけを選んで全体を"<i>"と"</i>"で囲む。
<replace before="&quot;(犬|猫)&quot;" after="&lt;i>$0&lt;/i>" />

● 複数の<replace />タグがある時
<replace />タグは、設定ファイル内での出現順に全て適用されます。

○ 例
"犬"を"猫"に、ただし"柴犬"は"三毛猫"に置換する場合。
次の順番で書いてください。
<replace before="柴犬" after="三毛猫" />
<replace before="犬" after="猫" />

もし、逆の順番、
<replace before="犬" after="猫" />
<replace before="柴犬" after="三毛猫" />
で書くと、1つ目のタグの効果で"柴犬"は"柴猫"に変換されてしまい、
2つ目のタグによる置換は発生しません。

最新の画像もっと見る