VxEditorで複数の検索置換を一括で行うDMonkeyマクロ-1 たとえば、選択範囲の中を検索して『hoge』があったら『予約』に、 『huga』があったら『表示』に置換を一回で行いたい場合のマクロ。 var e = new Editor; //エディタオブジェクトの作成 var text; text = e.SelText; //選択したテキストを取得 text = text .replace(/hoge/g,"予約") .replace(/huga/g,"表示") ; e.SelText = text; 本来はこれでいいはずですが、DMonkeyの正規表現エンジンは外国製の、 2バイトには対応していないものだそうで、このまま実行するとシフトJISの 一部の文字が化けてしまい、『予約』 は 『蘭・』、『表示』 は『侮ヲ』に なってしまいます。 (所謂『ダメ文字』問題)。
4 :
VxEditorで複数の検索置換を一括で行うDMonkeyマクロ-2 そこで>1が『テキストエディタをまったり語ろう ver.23』スレッドで相談したところ、 147氏がWSHによるマクロを作ってくださいました。こちらの正規表現エンジンは 普通に2バイト文字が通るので、問題なく置換できるようになりました。 e = new Editor; //エディタオブジェクトの作成 text = e.SelText; //選択したテキストを取得 // Windows Script Host(WSH)のRegExpオブジェクトを作成する reg = new ActiveXObject("VBScript.RegExp"); reg.IgnoreCase = false; //大文字と小文字を区別する reg.Global = true; //文字列全体を検索する reg.Pattern = "hoge"; text = reg.Replace(text, "予約"); reg.Pattern = "huga"; text = reg.Replace(text, "表示"); reg.Pattern = "hage"; text = reg.Replace(text, "はげ"); e.SelText = text;
5 :
VxEditorで複数の検索置換を一括で行うDMonkeyマクロ-3 さらに強欲な>1は検索文字列と置換文字列がもっとくっつけられないかと要求し、 親切な147氏は更に改良を加えてくださいました。 var words = new Array( "hoge","予約", "huga","表示", "hage","はげ" //←最後の行の末尾には , をつけない ); var e = new Editor; //エディタオブジェクトの作成 var text; text = e.SelText.toUTF8(); //選択したテキストを取得してUTF-8に変換 for (i = 0; i < words.length; i += 2) { text = text.replace(words(i).toUTF8(),"g",words(i+1).toUTF8()); } e.SelText = text.fromUTF8toSJIS(); //テキストをシフトJISに変換
自力で解決できました。分かってるひとには当然すぎる結果かもしれませんが、 折角なので書いときます。 1 2 3 4 5 12.30 15.25 ↑これを↓のようにしたくて、 1:00 2:00 3:00 4:00 5:00 12:30 15:25 >3 のマクロを使ったら、1・6・7行目しか置換できなかった。 原因は、正規表現のオプションにm(複数行対象)が入っていなかったことでした。 var e = new Editor; var text; text = e.SelText; text = text .replace(/^(\d+)$/mg,"$1:00") //←mが必要 .replace(/\./mg,":") //←mが必要 ; e.SelText = text;
27 :
>4 のマクロを使ったら、一行目のパターンがよくないというアラートが出て停まってしまう。 どうやら『0から9までの数字のどれか』を表す『\d』が使えないらしいということに気が付き、 パターンを『[0-9]』に変更するが、今度はそこいらじゅう:だらけになった。 \をつけても.をエスケープできてないことに気が付き、\\にしてやっと6・7行目が置換できた。 しかしまだ1〜5行目が置換できない。 原因は、>3 同様に複数行を対象にする『reg.Multiline = true;』がなかったことでした。 e = new Editor; text = e.SelText; reg = new ActiveXObject("VBScript.RegExp"); reg.IgnoreCase = true; reg.Multiline = true; //←この行を追加 reg.Global = true; reg.Pattern = "^([0-9]+)$"; text = reg.Replace(text, "$1:00"); //\dは使えない? reg.Pattern = "\\."; text = reg.Replace(text, ":"); //エスケープは二重(\\)にする e.SelText = text;
28 :
>5 のマクロを使ったら、なぜか選択文字列が全部消えたw もしや配列に正規表現は使えないのか? と思いましたが、そんなことはなく さっきまでの応用で、『\d→[0-9]』と『\→\\』と、mの追加で置換できるようになりました。 var words = new Array( "^([0-9]+)$","$1:00", "\\.",":" //←最後の行の末尾には , をつけない ); var e = new Editor; var text; text = e.SelText.toUTF8(); for (i = 0; i < words.length; i += 2) { text = text.replace(words(i).toUTF8(),"mg",words(i+1).toUTF8()); } e.SelText = text.fromUTF8toSJIS(); 連投スマソ。
ネットで見つけたEmEditor用のマクロを加工してみました。 (Var n in ent)とかevalとか、それを使う仕組みは分からないけど とりあえず使うことはできるので。 var ent = new Object(); ent = { "^(\\d+)$" : "$1:00", "\\." : ":" //←最後の行の末尾には , をつけない }; var e = new Editor; var text; text = e.SelText; for (var n in ent){ text = text.replace(eval("/" + n +"/mg"),ent[n]); //←imgの有無は必要に応じて } e.SelText = text;
31 :
折角教えてもらったのに、うっかりしてました。 テキストは一旦UTF-8にしないと一部の2バイト文字が化けるんでした。 var ent = new Object(); ent = { "^(\\d+)$" : "$1:00", "表\\." : ":" //←最後の行の末尾には , をつけない }; var e = new Editor; var text; text = e.SelText.toUTF8(); for (var n in ent){ text = text.replace(eval("/" + n.toUTF8() +"/img"),ent[n].toUTF8()); } e.SelText = text.fromUTF8toSJIS();
VxEditor用に英数字のみ半角にするマクロを書いてみました。 // 全角英数字を半角英数字に置換する var words = new Array( "0" , "0" , (略) "9" , "9" , "A" , "A" , (略) "Z" , "Z" , "a" , "a" , (略) "z" , "z" //←最後の行の末尾には , をつけない ); var e = new Editor; //エディタオブジェクトの作成 var reg = new ActiveXObject("VBScript.RegExp"); var text = e.SelText; //選択したテキストを取得 for (i = 0; i < words.length; i += 2) { reg.IgnoreCase = true; reg.Multiline = true; reg.Global = true; reg.Pattern = words(i); text = reg.Replace(text, words(i+1)); } e.SelText = text;
ふたつ以上の連続した改行をひとつにするマクロ。 oedit辺りだと、複数の改行にまたがって検索置換できるので、 検索:\n\n+ 置換:\n でひとつに統合できるし、VxEditorでもマクロならふたつ以上の改行もヒット するようにできるのですが、なぜか直前の文字のくり返しである + が 有効にならないようなので、仕方なく数種類の『複数の改行をひとつにする』を 何回か繰り返して最終的にひとつにします。 \n\n\n\n\n ←これはOK \n\n+ ←これはNG 美しくないですが、一応使えます。 var e = new Editor; var text = e.SelText; for (i = 1 ; i <=5 ; i++ ){ //初期状態では5回くりかえす text = text .replace(/\n\n\n\n/mg,"\n") //4つ連続する改行をひとつにする .replace(/\n\n\n/mg,"\n") //3つ連続する改行をひとつにする .replace(/\n\n/mg,"\n") //2つ連続する改行をひとつにする ; } e.SelText = text;
49 :
dmonkeyの正規表現は微妙なところあるね。 ↓dm.exe用テスト var test = "1\n2\n\n3\n\n\n4\n\n\n\n5\n\n\n\n\n---\n"; print(test); print(test.replace(/(\n)+/mg,"\n")); \nを()で括ってやると希望通りの結果になる。 ()がないと1つずつ置換するらしい。 マクロは↓でおk var e = new Editor; e.SelText = e.SelText.replace(/(\n)+/mg,"\n");
50 :
<Thanks> 神は居た。 \nだけじゃなく、繰り返しの直前の文字が2バイト文字もダメかも? 『用件を聞こう...』 『用件を聞こう・・・』 『用件を聞こう、、、』 『用件を聞こう‥‥』 『用件を聞こう・・・』 『用件を聞こう...』 ↑という語尾の点点を、三点リーダー2つの『用件を聞こう……』に統一したくて、 var e = new Editor; //e.SelText = e.SelText.replace(/(・・+|、、+|‥‥+|……+|\.\.+)/g,"……") ; e.SelText = e.SelText.replace(/(・・|、、|‥‥|………|\.\.|..)+/g,"……") ; 両方のパターンで実行してみたけど、1バイトのピリオド以外は繰り返しを認識くれませんでした。
51 :
で、WSHを使うこっちのマクロだとちゃんと置換されるので、 ダメ文字も含めて2バイト文字を扱うときはWSHのがいいのかしら。 var e = new Editor; reg = new ActiveXObject("VBScript.RegExp"); reg.IgnoreCase = true; reg.Multiline = true; reg.Global = true; reg.Pattern = "・・+|、、+|‥‥+|……+|\\.\\.+|..+"; e.SelText = reg.Replace(e.SelText, "……"); フツーに日本語を扱いたいだけなのに……。
52 :
先生ー、avast!君が唐突にキレはじめました イベントの種類: 警告 イベント ソース: avast! 説明: Sign of "Win32:Agent-LOL [Trj]" has been found in "C:\Program Files\VxEditor\VxGrep.exe" file.
抜き出してどうすりゃいいのか知らんけど、とりあえずalert var a = new Array(3,10,22); var el = Editor.Text.split("\n"); var s = ""; for (i in a) { s+=(a[i]<=Editor.LineCount)?el[a[i]-1]+"\n":""; } //最終行超えてたら空文字 alert(s);
/* (Tab)テスト(Tab)(Tab)test.html(tab) と書いてあれば、 <a href="test.html">テスト</a> に置換するマクロ。 */ var words = new Array( '\t([^<].*?)\t\t([a-z\.].*?)\t','<a href="$2">$1</a>' //←最後の行の末尾には , をつけない ); var e = new Editor; var text = e.SelText; for (i = 0; i < words.length; i += 2) { text = text.replace(words(i),"gim",words(i+1)); //大文字小文字は区別しない } e.SelText = text;
うーむ、言われてみてEmEditorのPerl用定義ファイルから抽出した予約語(200語くらいある) をkwd形式にして食わせてみたら、確かに以下の10語くらいしか強調されませんでした。 continue else for goto if return while delete do int new しかも別にPerlじゃなくても、ってのばっかだし。 バージョンは0.5.5で、Windows200SP4の組み合わせです。