Как сохранить значение $2 в переменной в InDesign GREP найти / изменить с помощью JavaScript

Я пишу 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 ответа

Решение

JS-интерфейс InDesign не делает этого за вас, он только возвращает полное совпадение.

поскольку 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 является $1 а также 4 является $2, Скорее всего, это не то, что вы ожидали. Поскольку вы неоднократно сопоставляете "группу 1" с +каждая следующая единичная цифра заменяет последнюю найденную (за исключением самой последней). Вы, вероятно, имели в виду что-то вроде

(\d+)(\d)

который вернется

2014
201
4

Я знаю, что на это уже есть ответ, но я подумал, что упомяну другой подход, который я считаю полезным. Один из способов сделать это - использовать lookbehinds и lookaheads, чтобы во втором наборе круглых скобок была найдена вся найденная строка. В вашем случае вы можете изменить свой поиск на

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

Это говорит о том, что "найдите цифру, которой предшествует цифра, а затем что-то, что не является цифрой. С помощью этого ваш найденный массив будет содержать только то, что соответствует второй \d (последней цифре в числе).

Вот довольно хорошее объяснение того, как они работают: http://carijansen.com/2013/03/03/positive-lookbehind-grep-for-designers/

Стоит отметить одну вещь: вы не можете использовать \d+ в виде сзади (это не может быть переменной длины). Вот почему я также использую Lookahead.

Другие вопросы по тегам