読者です 読者をやめる 読者になる 読者になる

k_ikiの雑記帳

DTPのこと、創作のことなど、思いつくまま

メタ文字のエスケープ

InDesign正規表現検索・置換をJavascript中に記述することができるわけですが、なぜか、InDesign上での正規表現検索・置換に成功したパターンをJavascript中にそのまま記述しても置換が成功しないことがあります。
今回、InDesignドキュメント中の半角括弧を全角に置換するスクリプトを書いていて気付きました。
どうやら、メタ文字のエスケープが効いていないようです。
そこで、バックスラッシュ自体もエスケープしてみました。
Macだとバックスラッシュがふたつ、Winだと円マークがふたつ連続している状態です。
そうすると、置換に成功しました。
※下記の検索パターンは、半角括弧で起こした後、改行することなく必ず半角括弧で閉じている文字列を最小一致にて検索対象としています。念のため。
(Mac OSX 10.7.5 / Windows7 pro SP1、いずれもInDesign CS6にて検証)

var mySel = app.selection[0];
var myObj = mySel.parentStory;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "\\((.*?)\\)";
app.changeGrepPreferences.changeTo = "($1)";
myObj.changeGrep();

これ、たけうちとおるさんが発表なさってる検索置換(1)変換.jsxに検索文字列と置換文字列を入れてやれば、検索範囲のコントロールができるので便利ですね。
ところで今リンク先のたけうちさんの記事に寄せられている、私のそれより新しいコメントに気付いたのですが、数字を表すメタ文字 \d が反応しないというのも同じ理由です。
Javascript中では \\d と記述してやらないとInDesign側へバックスラッシュ文字を渡してやることができず、数字にマッチしないどころか d そのものにマッチしてしまうのです。
 
 
追記
スタイルグループに対応しないという記述を見落とした(^^;
たけうちさんのスクリプト中、たとえば置換用段落スタイルならスクリプト冒頭付近でスタイル名を入力しておき、検索置換関数内で

app.activeDocument.paragraphStyles.item(myChangeP_style);

としてスタイル名を受け取るところがあるわけですが、グループ名を指定する記述がありません。
グループ名が必要ならグループ名も指定してやらないといけないのです。

app.activeDocument.paragraphStyleGroups.itemByName("グループ名").paragraphStyles.itemByName("スタイル名");

というふうに。
InDesignタグテキストであれば  という記述でよい タグテキストにおけるグルーピングしたスタイル参照) ですし、グループ内のスタイルを当てた文字列をスタイルパネルで確認すると スタイル名 (グループ名) と表示されているので、スクリプト内でもそのように記述すればよいのではないかと思ってしまうかもしれない(私はそうでした……)のですが、そうではないのですね。