Как сделать подстановочный знак / GREP / регулярное выражение найти-заменить в Illustrator?

InDesign может выполнять расширенный поиск-изменение, также известный как поиск-замена, с использованием правил GREP, также известных как регулярные выражения, также известные как регулярные выражения, которые позволяют использовать все виды подстановочных знаков и автоматизацию.

Есть ли способ сделать то же самое в Illustrator?

Ответы (2)

Я сделал сценарий для этого. Я тестировал его в Illustrator CS6 на Mac и в Windows.

Он выполняет регулярное выражение для поиска и замены текста в выбранных элементах или для всего текста, если ничего не выбрано.

Он работает с точечным текстом, текстом области и текстом на пути и не возражает, если в выделение включены нетекстовые элементы.

Примечание: похоже, существует ошибка, из-за которой иногда не удается найти текст в выбранных группах. Если вы столкнулись с этим, попробуйте запустить скрипт, ничего не выделенный, или разгруппировать.


Текст регулярного выражения replace.js

var scope = app.activeDocument.selection.length ? app.activeDocument.selection : app.activeDocument.pageItems;

var find = prompt("Find: (Text or GREP/regex)","");
if(find !== null){

    var replace = prompt("Replace: (Text or GREP/regex)","");
    if(replace !== null){

        var changes = 0;

        for(var i=0;i<scope.length;i++){  

            var text = scope[i];

            var string = text.contents;  
            if(typeof string == "string"){
                var newstring = string.replace( new RegExp(find, 'g'), replace);
                if (newstring != string) {
                    changes++;
                    var paragraphsArray = newstring.split("\n");
                    text.paragraphs.removeAll(); 
                    for(var ii=0;ii<paragraphsArray.length;ii++){  
                         text.paragraphs.add(paragraphsArray[ii]);
                    }
                }
            }
        }
        alert( changes==1 ? "1 text object changed" : changes + " text objects changed");
    }
}

Любое правило GREP из InDesign должно работать — я рекомендую создать и протестировать правило в InDesign Paragraph styles > GREP rulesс некоторым образцом текста и установленным флажком Preview, а затем скопировать код GREP в этот сценарий — что проще, чем метод проб и ошибок с этим сценарием.

В Replace, вы можете использовать $1для всего, что соответствует первой паре скобок ( (to )), $2для второй и т. д.


Вот несколько примеров, которые я тестировал с ним:

  • Простой поиск/замена:
    • Находить:test
    • Заменять:hello
  • Простой поиск/замена с помощью одного подстановочного знака, совпадения test, tentи te!tт. д. Примечание . Если вы хотите, чтобы в вашем поиске был обычный символ ., вам нужно поставить его \перед ним, чтобы он не рассматривался как специальный символ, например This be a sentence\. This be another\.- это верно для большинства знаки препинания:
    • Находить:te.t
    • Заменять:hello
  • Добавьте % ко всем числам в выделении (это соответствует числам с десятичной точкой и одной запятой и без нее, например 123, 12,3, 1234 и 1234,5 — для номеров в континентальном европейском стиле, таких как 1.234,5, переключите ,и .):
    • Находить:(\d+\,?\d*\.?\d*)
    • Заменять:$1%
  • Превратите несколько пробелов в один пробел:
    • Найти: +(перед этим есть пробел + который обрезается)
    • Заменить: (пробел)
После тестирования некорректно выполняются следующие метасимволы: ^ $ /n (?<=) (?<!) (?=) (?!)
var scope = app.activeDocument.selection.length ? app.activeDocument.selection : app.activeDocument.pageItems;

изменить на

var scope = app.activeDocument.selection.length ? app.activeDocument.selection : app.activeDocument.textFrames;
Будет ли activeDocument.textFramesтакже нацелен точечный текст, текст на пути и т. д., или он будет нацелен только на текстовые фреймы с фиксированной ограничивающей рамкой?