1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サクラエディタでマクロ置換をしてみた(js)

Last updated at Posted at 2021-03-25

今回使用する言語は、Jscriptという太古のJavaScriptェ...
正規表現を使わず作った。
関数の詳細は調べてください。

.js

//描画非表示
SetDrawSwitch(0);

//問題点:
//replaceAllでは、なぜかメタ文字を組み合わせるとエラー
//なので正規表現を使わない


//全ての「12」をXに置換
var a = '1';
var b = '2';

replaceAll(a+b,'X',26);


//全ての「field="list[__$(〇〇)__].a」をXに置換
var property = 'list';
var list = [
'a',
'b',
'c'];

for(var i = 0 ; i < list.length ; i++){
	replaceAll('field="'+ property + '[__$(' + list[i]+ ')__].a','X',26);
};


//画面表示
SetDrawSwitch(1);
//再描画
Redraw(0);

問題点:
replaceAllでは、なぜかメタ文字を組み合わせるとエラー
なので正規表現を使わなかった。

問題点詳細
replaceAllのオプションで26→30にして正規表現を有効化。
以下のようにエスケープ必要文字(メタ文字)をエスケープ処理しているのになぜか置換されない。(.*等の正規表現は問題なく使える)
replaceAll(property + '¥{AB¥}','X',30);
もちろん正規表現を無効で置換すればメタ文字として認識されないが、有効なままエスケープしたい。

追記
「¥」ではどうやらエスケープされないようだ。。どうすれば?
追記
角括弧で囲めば置換できた。
replaceAll(property + '[{]AB[}]','X',30);
注意点:角括弧内の文字どれかにでもマッチすれば置換されてしまうので角括弧内は1文字にする。
これでなぜ置換成功するかと言うと角括弧内ではエスケープ必要文字が減る。
少なくとも¥、[、]、^はエスケープの必要がある。

追記
jsの置換関数の正規表現を使って解決する方法
''の代わりに/〜/gで囲むと正規表現が有効になり全置換される。
.replace(/ここのメタ文字は¥でエスケープできる/g, "置換後");

サンプル.js
SetDrawSwitch(0);
GoFileTop();

//ヒットしなくなるまで繰り返す
while(true){
    SearchNext('^.*置換対象文字列.*$', 2068); //行単位で検索
    var searchWord =GetselectedString(0); // 選択値取得
    if(searchWord=='')break;

    // 行の指定箇所全てを置換する
    var covertedWord = searchWord.replace(/置換対象文字列/g, '置換後文字列');
    Delete();
    InsText(covertedWord); //挿入
};

SetDrawSwitch(1);
Redraw(0);

   
置換対象文字列を変数で置き換えたい場合はRegExpを使う。

RegExp例.js
//定義
var befor = '置換対象文字列'
var after = '置換後文字列'

//検索部分
SearchNext('^.*'+ befor +'.*$', 2068);

//置換処理部分
var covertedWord = searchWord.replace(new RegExp(befor,'g'), after);

追記ここまで


あと、上記のコードのままだと置換したい単語が300にもなると10秒ほど掛かってしまう。
このマクロを複数ファイルで使用するつもりで使わない単語も書いてしまっている場合、
単語検索してヒットしなかったら次のindexへ移るようにしたらかなり早くなった。

.js

//描画非表示
SetDrawSwitch(0);

var property = 'list';
var key = [
'n',
'n',
'n',
'n',
'n',
'a',
'a',
'a',
'b',
'n',
'n',
'n',
'n',
'n',
'n',
'n',
'n',
'n',
'c'];

//配列を繰り返す
for(var i = 0 ; i < key.length ; i++){

	//見つからなければ次のindexへの処理
	for(var h = i; h < key.length ; h++){
	SearchNext('list'+key[i], 2099);//第一引数に検索対象、正規表現無効
	var s = GetSelectedString(0);//値取得
	    if(s == ''){//なければnext index...
	    	i++;
	    }else{
	    	break;
	    };
	};

    ////全置換replaceAll(置換対象,置換後,オプション)
    replaceAll(property+key[i],i,26);//正規表現無効
};


//MessageBox();//ポップアップ表示用

//画面表示
SetDrawSwitch(1);
//再描画
Redraw(0);
置換前.
listn
lista
listb
listc
lista
置換後.
0
5
8
18
5

説明
画面上の「listn」は早々に全置換され存在しないわけだから
そのあと何回も置換しようとするとそりゃ遅いわけだ。
SearchNextで置換対象文字列がヒットすれば通常通り時間がかかるが
ヒットしなかったらほとんど0秒に近い速度で次のindexへ移る。
300単語追加して10秒かかっていた処理がこれで対象外が省かれた速度になる。
150/300単語が置換される予定なら単純に5秒程度になる。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?