Как сохранить значение $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.