如何在InDesign GREP中使用javascript查找/更改变量中的$ 2值

时间:2014-05-04 15:38:45

标签: javascript adobe-indesign grep-indesign

我正在编写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)

2 个答案:

答案 0 :(得分: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),1$14$2。这很可能不是您所期望的。由于您反复将“组1”与+匹配,因此每个下一个数字都会替换最后找到的一个数字(期望最后一个数字)。你可能意味着像

(\d+)(\d)

将返回

2014
201
4

答案 1 :(得分:1)

我知道这已经有了答案,但我想我会提到另一种我认为有用的方法。一种方法是使用lookbehinds和lookaheads,以便第二组括号中的东西是找到的字符串的全部内容。在您的情况下,您可以将搜索更改为

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

这说的是“找到一个以数字开头的数字,然后是不是数字的数字。使用这个,你找到的数组只包含第二个匹配的数字(最后一个数字)数)。

以下是对这些工作原理的一个非常好的解释:http://carijansen.com/2013/03/03/positive-lookbehind-grep-for-designers/

有一点需要注意:你不能在lookbehind中使用\ d +(它不能是可变长度)。这也是我使用前瞻的原因。