置換のときに数字を計算するNo.35591
柳絮 さん 17/02/15 04:47
 
いつもお世話になります。

文中にある和暦を検索置換で西暦に直そうとしています。対象は昭和です。つまり昭
和40年→1965年というように直したいのです。

幸い昭和は、64年まですべて19XX年の形式に収まり、下2桁に25を加えれば西暦にな
ります。そこで簡単な検索置換でこれが実現できないかと考えました。実現したいのは

昭和→19
40→65
年→年
という置換です。

これは昭和の後に続く数字に25を足したものを19の後に続けるということです。

お教えいただきたいのは、秀丸でこのような数字の演算ができるのかということです。
下記のような検索置換式でXXの部分を工夫すればうまくいくのではないかと考えてい
ます。ただXXを(\\1+25)にしただけでは勿論うまくいきませんでした。何か関数が使
えればと思っているのですが。

replaceall "昭和([0-9]{1,2})年", "19XX年" , regular, nocasesense, inselect,
nohilight;

どうぞよろしくお願いします。

柳絮


[ ]
RE:35591 置換のときに数字を計算するNo.35592
秀丸担当 さん 17/02/15 12:49
 

replaceallの一回の置換で数値の演算をすることは基本的にはできないです。
マクロでやるとしたら、検索された文字列を取得してから、計算し、その後計算
されたものを挿入するということになります。
あるいは取得後にもう一度同じ個所を置換という方法でもいいと思います。
例えば以下のようなマクロになります。

setcompatiblemode 0x20000;
disabledraw;
gofiletop;
$s="昭和([0-9]{1,2})年";
while(1){
  searchdown2 $s+"(?\\1)",regular;
  if(result==false) break;
  $found=gettext(foundtopx,foundtopy,foundendx,foundendy);
  replaceup $s
    ,str(val($found)+1925)+"年"
    ,regular;
}


参考までの情報としてですが、何か関数を使うという意味では、replaceallの
一回の置換で、何らかの処理を加える手段として変換モジュールを使う方法があ
ります。
例えば、以下のような置換で、英単語の先頭(\1の部分)を大文字にして、それ以
降(\2の部分)を小文字にできたりします。

replaceall "([a-z])([a-z]*)", "\\(1,ToUpper)\\(2,ToLower)"
  ,nocasesense, regular;

これは標準の変換モジュールのToUpper関数とToLower関数を使っていますが、別
途用意された変換モジュールがあれば他の関数を使うことも可能です。

ただ以下の変換モジュールライブラリのページ
http://hide.maruo.co.jp/lib/hmconv/index.html
にアップされているものの中では加算に該当するものは無さそうでした。
標準の変換として、単純な数字の羅列の整数の加算/減算はあってもいいという
気がします。

[ ]
RE:35592 置換のときに数字を計算するNo.35593
柳絮 さん 17/02/15 17:23
 
秀丸担当様

ご返事を有難う御座いました。そうですか、一行でできないこと了解しました。

実現したかったのは、これを用語集に組み込んで日本語から英語に翻訳するときに文
章の中に出てくる昭和40年を一回で1965と置換することでした。そこで他の言葉の検
索置換と同様に一行で済ませたいと考えたのです。

エクセルの関数のようなものを考えていたのですが、変換モジュールライブラリーに
もないということで、今後の開発に期待しています。



しかし代替案をお示しいただいたので、少しそちらの方向でも考えてみたいと思いま
す。約5千語ある通常の一行処理をする前に、特別処理としてこれだけを先に実行し
てしまうやり方を検討してみます。

お時間をいただいてお示しいただいたことに感謝します。


柳絮

[ ]
RE:35593 置換のときに数字を計算するNo.35595
柳絮 さん 17/02/16 01:51
 
秀丸担当様

お教えいただいたマクロを取り込み、やりたいことが実現しました。その顛末を「計
算して置換 和暦西暦の換算」と題して公開しました(https://goo.gl/vopaS8)。
改めて御礼申し上げます。

柳絮

[ ]