いやあ、また秀丸エディタの正規表現ではまってしまった(^^;
マッチした文字を抜き出すところで毎回ひっかかるな(^^;
まあ、秀丸であんまりややこしい正規表現使うことが無いので、たまに一部文字列の置換とかをする時にうろ覚えでやっちゃってハマっちゃうんだよな(^^;
何か、以前も一回、このブログでも書いた気がするが、例えば下のような例。
(例)何かの拍子に壊れてしまった CSV ファイルを修復する。
本来なら、'ほげほげ' という具合に文字列が入った項目のあとに、5つ空の項目が続いてから(シングルクォーテーションで括られている)、数値(シングルクォーテーションで括られていない)が来る・・・という構造なのに、間の空の項目が 4つになってしまっている行があるので修復。
Perl で書けば、
$str =~ s/'([^\s]+?)', '', '', '', '', ([0-9]+?),/'$1', '', '', '', '', '', $2,/s
って感じか。(いや、こんなにバカみたいにシングルクォーテーションの部分を書かなくてもいいんだけど、今回はこんな感じで(^^;)
これを、秀丸の正規表現で書くと、()で囲ってマッチングした文字列を抜き出す機能が秀丸にはないので、代わりに \f という区切り文字を使うことになる。
こんな感じ↓
'\f[^\s]+?\f', '', '', '', '', \f[0-9]+?\f,
で、ここで、ついつい Perl の(つーか、POSIX拡張の?)正規表現のつもりで、\f[^\s]+?\f が一つ目の項目、\f[0-9]+?\f が二つ目の項目だと誤解しちゃう。
'あいうえお', '', '', '', '', 1234,
というデータだと(ちなみに、$1, $2...は、秀丸だと \1, \2...と表現)、
\1 あいうえお
\2 1234
と思っちゃうんだけど、これが大間違い。
\f は区切り文字なので(開始のカッコに閉じカッコってわけじゃないので)、
\1 あいうえお
\2 ', '', '', '', '',
\3 1234
となるんだよなあ。
ちなみに、\f で囲まれている範囲しか対象にはならないので、
\1 '
\2 あいうえお
\3 ', '', '', '', '',
\4 1234
\5 ,
というわけではない。(Perl で、/'([^\s]+?)(', '', '', '', '', )([0-9]+?),/ こう書いてるのと一緒)
つーことで、本来 \3 をセットするべきところに、一生懸命 \2 をセットして、何やねん、このわけのわからん置換結果は・・・と悩んどったわ(^^;
てか、秀丸エディタには大変お世話になってるんだけど(ちゃんと PC 毎にライセンスも取得)、この HMJRE.DLL の正規表現には違和感あるわ。
なんで、Perl 拡張正規表現互換にしないんだろう。
Ruby や、Python は Perl 拡張互換だし、Adobe の ActionScript もそうだ。Java もだよね?(Perl は正規表現最強言語だからな(笑))
秀丸で () や $1,$2... みたいな表現を使わない(使えない?)理由って何かあるのかね・・・???