1

私は InDesign の JavaScript を書いています。これは GREP の検索/変更を行うものです。実際のところ、テキストを検索してスクリプト変数に保存する必要があるのは、grep が $2 の値で見つけたものです。スクリプトの他のすべての方法は知っています。今必要なのは、この 2 ドルを手に入れる方法を見つけることです

簡単な例:

app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "(\\d)+(\\d)";
found = app.activeDocument.findGrep();
...
found[0].contents; // this store entire string with both digits and plus, and I need only $2 value (second digit in this case)
4

2 に答える 2

1

InDesign の JS インターフェースはそれを行いません。完全な一致を返すだけです。

contentsは単純な Javascript 文字列であるため (もはやネイティブの InDesign テキストではありません)、Javascript 独自の関数を使用できますmatch

..
app.findGrepPreferences.findWhat = "(\\d)+(\\d)";
found = app.activeDocument.findGrep();
m = found[0].contents.match (/(\d)+(\d)/);
alert (m.join('\n'));

InDesign の GREP 構文と Javascript の構文を混在させないように注意してください。特に、 などの特殊文字~<は ID 拡張であり、JS では失敗します。


「2014」の入力の場合、これは返されることに注意してください

2014
1
4

ここで、最初の行は完全一致 ( に等しい$0)、1is$1および4is$2です。これはおそらくあなたが期待したものではありません。「グループ 1」と を繰り返し一致させるため+、次の 1 桁ごとに最後に見つかったものを置き換えます (最後の数字を期待してください)。あなたはおそらく次のようなことを意味しました

(\d+)(\d)

戻ります

2014
201
4
于 2014-05-04T15:53:21.660 に答える
1

これにはすでに答えがあることは知っていますが、私が役立つと思う別のアプローチについて言及したいと思いました。これを行う 1 つの方法は、後読みと先読みを使用して、2 番目の括弧のセットにあるものが見つかった文字列全体になるようにすることです。あなたの場合、検索を次のように変更できます

(?<=\\d)\\d(?!\\d)

これが言うことは、「数字が先行し、その後に数字ではない数字が続く数字を見つけることです。これを使用すると、見つかった配列には、2番目の \d が一致するもの(数字の最後の数字)のみが含まれます。

これらがどのように機能するかについてのかなり良い説明があります:http://carijansen.com/2013/03/03/positive-lookbehind-grep-for-designers/

1 つ注意してください: 後読みで \d+ を使用することはできません (可変長にすることはできません)。そのため、先読みも使用します。

于 2014-05-14T18:18:11.990 に答える