Applekdz
@Applekdz

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

一括置換が出来ないと何万行も繰り返しコードを書かなければならない問題は、現在のバージョンで1行記述が可能でしょうか? 結論はEmEditorで可能です。後述部分

お世話になっております。
一括置換関連の追加質問です。
新しくスレッドで困っている課題の例文を書きました。

前回の一括置換の要望の続きになるのですが、これに関しては、長期間悩んでいます。
EmEditorなら既に以下の問題は方法があるのではないかと思います。

複数の人から正規表現では無理と訊きましたのでEmEditorの機能追加か現在のバージョンで可能か?です。

以下の問題です。

事例の例文
しはれはれし※にはまはのしれ◆しはしはり◆きれとりの◆きれとのき◆れしはし◆はのれと◆しのしとれはりの◆としれはの♪れりはしれのれ

※から♪の範囲の内部にある◆のみを★に変えたいです。
ただし、例文で書いているのと実際の使用時と違うのは、対象の◆が何千個以上も含まれる可能性があることです。
そのため実際の困った事例のサンプルは書き切れませんがひとつの可能性の変換候補だけで◆が数千個とか数万個とあるとします。
さらに、それに加えて同様の可能性のある候補が数千パターンあるという前提です。

これを正規表現の置換でやっても左側の一ヶ所しか変わりませんでした。正規表現ではそうなると複数から言われますので正規表現の機能では一発で変換するのは無理だと思います。

document.selection.Replace("(※.*?)◆(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);

このため、正規表現では以下のように可能性のある数だけ莫大に書かないと行けませんので指定項目が増えればこれだと繰り返しの累積だけで何百万行になりますから事実上不可能です。
そのため未変換な文字が大量に残ります。
たとえ候補が数十個程度の可能性でもかなり難しいです。

document.selection.Replace("(※.*?)★(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("(※.*?)★(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("(※.*?)★(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("(※.*?)★(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("(※.*?)★(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("(※.*?)★(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("(※.*?)★(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0);

♪の範囲の内部にある◆のみを★に変えたいときにサンプルは6個ですが、その対象が数千個合った場合にも一発、もしくは一行のコードで変換したいのです。
もしくは、一行だけのコードで可能性がある探索回数を指定するというコードは可能でしょうか?

このような事例のときはどのようにコードを書くといけますでしょうか?
よろしくお願いいたします。

追記
数万個というのは大げさな話になってしまいますのと限定された使用のため、よくある数十個の場合で、1行コードだけで可能でしょうか?
よろしくお願いいたします。

回答頂いてからの追記です。 

BatchReplaceの場合は以下で1行コードで繰り返し出来ました。

batch_list = editor.filters;
for( i = 0; i < 5; ++i )
batch_list.AddReplace("(※.?)◆(.?♪)",\1★\2,eeFindReplaceRegExp,0);
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);

教えて頂いたこちらの記述でも出来ました。これは、実質的に一括置換そのものです。何万個でも1行で書けました。ありがとうございます。

やはり、EmEditorだとやりたいことのほとんどは既に可能でした。

0

3Answer

以下のように書くと可能です。

while( document.selection.Replace("(※.*?)◆(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0) );

0Like

Comments

  1. @Applekdz

    Questioner

    出来ました。ありがとうございます。
    本文に追記しました。
    よろしくお願いいたします。

メールでも同じご報告をいただいていますが、メールで返信したように、このクラッシュの問題は次のバージョンで修正されます。

0Like

Comments

  1. @Applekdz

    Questioner

    ありがとうございます。
    繰り返しは、
    document.selection.Replace("","",eeReplaceAll | eeFindReplaceRegExp,0);ではなく、

    batch_list = editor.filters;のbatch_list.AddReplace("","",eeFindReplaceRegExp,0);で繰り返しの記述は可能でしょうか?
    よろしくお願いいたします。

while( document.selection.Replace("(※.*?)◆(.*?♪)","\\1★\\2",eeReplaceAll | eeFindReplaceRegExp,0) ); と同じ事は、BatchReplace を使ってできません。

0Like

Comments

  1. @Applekdz

    Questioner

    わかりました。ありがとうございます。
    スレッド冒頭には一括置換可能だったことを書きたしておきます。
    よろしくお願いいたします。

Your answer might help someone💌