- 作成者投稿
- 2023年1月28日 7:08 pm #30992
Applek
参加者お世話になっております。
たとえば以下のような事例です。
これは単純な事例ですが、実際はこの行が数千とか数万行あります。☆
北海道
青森
岩手
秋田
★このような文があったとします。
正規表現で削除だと、
batch_list.AddReplace(“\\n”,”⏎”,eeFindReplaceRegExp,0);// シングルライン
batch_list.AddReplace(“(☆[^⏎]*?)⏎(.*?★)”,”\\1\\2″,eeFindReplaceRegExp | eeFindReplaceCase,0);
batch_list.AddReplace(“⏎”,”\\n”,eeFindReplaceRegExp,0);// シングルラインモード解除document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
ただ、このような書き方は、数百行のときや数千行ある場合の両方に汎用化して使う場合だとだと
for( i = 0; i < 8000; ++i )
とか書く必要がありますのでムチャクチャ時間がかかりますし、対象が5行だった場合でも8000回待つ必要があります。、。こうするとたった10行しかない文書でも8000回繰り返されることになります。
前にお尋ねしたときに教えて頂いたマクロで応用できそうです。
以下ですが、☆~★までの範囲は削除するということでいけましたが、☆~★までの間にある特定の文字のみを削除するというのはわかりませんでした。
もっと単純に書ける新機能は追加して頂けませんでしょうか?function DeleteLines( s1, s2 )
{
document.selection.StartOfDocument(false);
while( document.selection.Find(s1,eeFindNext,0) ) {
editor.ExecuteCommandByID(4153); // 文字選択を開始
if( !document.selection.Find(s2,eeFindNext,0) ) {
alert( “Cannot find ” + s2 + ” for ” + s1 ); // s1 に対応する s2 が見つからない場合にメッセージを表示する
return;
}
document.selection.SetBookmark();
}
editor.ExecuteCommandByID(4589); // この文書のブックマークされた行を削除
}
var startTime = new Date();
DiscardUndo = true;
Redraw = false;
editor.ExecuteCommandByID(4323); // この文書のブックマークをクリア
DeleteLines( “☆”, “★” );// ここに消したい範囲の先頭文字を書く ☆から★までを消す
var endTime = new Date();
var elapsedTime = (endTime.getTime() – startTime.getTime()) / 1000.0;
// alert( “Elapsed time = ” + elapsedTime + “s\n” );// かかった秒数を表示範囲指定内の特定文字だけ一括削除できる機能か、もしくは、正規表現だと一度空振りを検知した時点で繰り返しを終了するを新機能にしていただけませんでしょうか?
よろしくお願いいたします。2023年1月28日 8:45 pm #30993Applek
参加者範囲内の指定文字や改行を一括削除できる機能と対象がなかった時点で正規表現をストップする機能
タイトルが短くなりました。
よろしくお願いいたします。2023年1月29日 6:29 am #30995Applek
参加者お世話になっております。
上記の件を汎用化して要望しますと削除だけでなく、特定範囲に対する正規表現や一括置換を簡単に範囲を指定するだけで書けるようにしてもらいたいという機能です。事例サンプル
あああああ◎←これは変更させません
いいいいい◎←これは変更させません☆←この範囲の◎だけ▼に変更
青森◎
秋田◎
岩手◎
★←この範囲の◎だけ▼に変更ううううう◎←これは変更させません
えええええ◎←これは変更させませんまず範囲指定のコードで☆~★の最短一致の範囲指定のコードを記述
batch_list.AddReplace(“◎$”,”▼”,eeFindReplaceRegExp | eeFindReplaceCase,0);// ☆から★の間にある◎$のみを▼に変更する
範囲指定を閉じるコードこのように2~3行で書けるようにしてもらいたいです。
従来の正規表現だと、そのまま書くと文書全体にまるごと適応されて全部変更されるので範囲指定内で変更したい場合は以下のようにする必要がありました。batch_list.AddReplace(“\\n”,”⏎”,eeFindReplaceRegExp,0);// シングルラインモード
for( i = 0; i < 200; ++i )
batch_list.AddReplace(“(☆[^⏎]*?)◎⏎(.*?★)”,”\\1▼⏎\\2″,eeFindReplaceRegExp | eeFindReplaceCase,0);
batch_list.AddReplace(“⏎”,”\\n”,eeFindReplaceRegExp,0);// シングルラインモード解除この機能が追加されると範囲内のみ指定した範囲だけで普通の正規表現や一括置換で記載して一回で置換できます。
もしかしたら既に機能があって、私が気がついていないだけかも知れません。
よろしくお願いいたします。2023年1月29日 8:58 am #30997Applek
参加者お世話になっております。
もうちょっと汎用的に言いますと正規表現や削除以外も含めてあらゆる編集機能を範囲を指定して、その範囲だけに限定した編集が容易に可能になる機能です。
範囲を指定したコードで閉じた部分は、その範囲にだけ適応して動作するというものです。
従来は、特定のことをすると文書全体に適応されましたので特定の範囲だけに限定した編集が難しかったです。
最短一致と最長の範囲で指定できる機能です。
よろしくお願いいたします。2023年1月30日 12:06 pm #31001Applek
参加者お世話になっております。
私が正規表現などの使い方、書き方を知らないだけかも知れませんが、正規表現でビックデータの編集で毎回非常に困るのは、特定の範囲のみに何かしたいときに非常に苦労することです。
先の事例のように☆~★の範囲だけの範囲で何か変更したいときに難しいです。
その範囲以外の部分に適応されると困るため単純に
batch_list.AddReplace(“◎$”,”▼”,eeFindReplaceRegExp | eeFindReplaceCase,0);
こんなふうに書くわけにはいかないです。文書のすべての部分にマッチします。以下のように書くとビックデータとなると絶望的な遅さで置換不可能です。
batch_list.AddReplace(“\\n”,”⏎”,eeFindReplaceRegExp,0);// シングルラインモード
for( i = 0; i < 20000; ++i )
batch_list.AddReplace(“(☆[^⏎]*?)◎⏎(.*?★)”,”\\1▼⏎\\2″,eeFindReplaceRegExp | eeFindReplaceCase,0);// ◎を▼に変更
batch_list.AddReplace(“⏎”,”\\n”,eeFindReplaceRegExp,0);// シングルラインモード解除もし以下のように範囲指定だけで書ければ、数行で済み、記述も数行で文章丸ごと適応させるときと同じ記載で済みます。
範囲指定のコード ☆~★の記述 最短か最長を指定
batch_list.AddReplace(“◎$”,”▼”,eeFindReplaceRegExp | eeFindReplaceCase,0);// 通常の文書まるごと適応のときと同じ正規表現コード
範囲指定終わりのコードこのような一瞬で特定範囲だけ限定して普通の正規表現で動作させる書き方の方法はありますでしょうか?
よろしくお願いいたします。2023年1月31日 5:11 pm #31006Applek
参加者お世話になっております。
範囲指定機能があると、複雑な一般には難しい書き方ではなく、特定部位の削除も実質的に一行で初心者レベルですぐ書けるようになります。
従来は、^.*$ こんな書き方は、すべて文書のあらゆるところにマッチするので特定部位に何か変更するとか消すことに対してムチャクチャ難しい書き方や正規表現は動作が重くなりました。
ビックデータではほとんど不可能でした。
特定部位に対する編集が劇的に簡単に速くなります。☆~★の最短一致の範囲指定のコードを記述
batch_list.AddReplace(“^.*$\\n”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);// ☆から★の間に限定してすべての文字を消す いらない範囲のみ消す
範囲指定を閉じるコード 最長か最短かのフラグ2023年3月22日 5:37 pm #31052Applek
参加者お世話になっております。
この質問、要望はEmEditorバージョン4から、とっくに可能な機能でした。
まだまだEmEditorの機能は、わかってなかった、使いこなせてないようです。
以下の方法で、繰り返し無しですぐ置換できました。
見た人が誤解されないように書いておきます。document.selection.Find(“ここから.*?ここまで”,eeFindNext | eeFindReplaceRegExp | eeFindSelectAll,0);// 置換の検索範囲を指定
batch_list = editor.filters;
batch_list.AddReplace(“あおもり”,”青森”,eeFindReplaceRegExp | eeFindReplaceCase,0);// 置換する内容
document.selection.BatchReplace(batch_list,eeFindReplaceSelOnly | eeReplaceAll,0);// 検索範囲のみ置換マニュアル
https://www.emeditor.org/ja/macro_selection_selection_replace.html
https://www.emeditor.org/ja/macro_selection_selection_find.html - 作成者投稿
- このトピックに返信するにはログインしてください。