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

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

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

这说的是“找到一个前面有一个数字的数字,然后是一个不是数字的数字。使用它,您找到的数组将只包含第二个 \d 匹配的任何内容(数字中的最后一个数字)。

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

需要注意的一件事:您不能在后视中使用 \d+ (它不能是可变长度)。这就是为什么我也使用前瞻。

于 2014-05-14T18:18:11.990 回答
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$14is $2。这很可能不是您所期望的。由于您反复将“组 1”与 匹配+,因此下一个单个数字将替换最后找到的一个(期望最后一个)。你可能的意思是

(\d+)(\d)

这将返回

2014
201
4
于 2014-05-04T15:53:21.660 回答