match не работает регулярка

Статус
Закрыто для дальнейших ответов.

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
Имеем текст Индизайновском текстовом боксе в виде
Вася (табуляция) 5 (перенос строки)
Петя (табуляция) 7 (перенос строки)
Сергей (табуляция) 14-95 (перенос строки)

В скрипте надо получить 2 массива 1-й имена (Вася, Петя, Сергей), 2-й символы справа от табуляции и до конца строки (числа (5,7,14-95)

PHP:
with (app) {
var mySpis = selection[0].contents; 
var arrname = mySpis.match(/^.+(?=\t)/gm);
var arrpage = mySpis.match(/(?<=\t).+\n/gm);
}
(/^.+(?=\t)/gm) - поиск от начала строки ничего не дает
(/(?<=\t).+\n/gm) поиск от табуляции до конца строки тоже

замена \t и \n на юникод ( \u0009 и \u000A ) тоже результатов не принесла.

Я вообще нулевой в программировании, поэтому прошу особо не пинать. Я даже не понимаю в каком виде находиться текст ( selection[0].contents) в памяти компа selection[0].contents - я так понимаю как одна строка с управляющими символами (тогда формат юникод?) Кроме того я не уверен работает ли обратный поиск в Javascript.

P.S. А как вообще отлаживают скрипты в Indesign. ExtendScript Toolkit у меня например никак не реагирует после вызова диалога. (я понимаю что я где-то туплю, но вот где? Хотя скорее всего везде :( )
 

Eugenyus

Модератор
12 лет на форуме
Сообщения
1 960
Реакции
3 588
Ответ: match не работает ругулярка

Можно и без поиска обойтись, как-то так:
Код:
var myText = app.activeDocument.selection[0].contents.split("\n"); //Выделенный текст превратили в массив, разбили по строкам
var arr1 = []; //Слева от таба
var arr2 = []; //Справа от таба
var tmpArr = [];
for(i=0;i<myText.length;i++){
    tmpArr = myText[i].split("\t"); //Разбили строку на массив, разделитель - tab
    arr1[i] = tmpArr[0];
    arr2[i] = tmpArr[1];
    }
alert(arr1.join("\n")+"\n\n"+arr2.join("\n"));
 

kstati

иɯɐɯɔʞ
Сообщения
1 138
Реакции
511
Ответ: match не работает ругулярка

Ну, да, можно простым сплитом.
А уже если регулярками, то в этом примере подойдёт вариант попроще /^(.*?)\t(.*)$/g
$1 — первая част $2 — вторая
 

pirate-party

Участник
Сообщения
42
Реакции
150
Ответ: match не работает регулярка

Просмотр назад не работает в JavaScript, поэтому второй массив будет вместе с табуляторами. Другая проблема в том, что InDesign использует в качестве разделителей строк символ "\r", а JS считает такой текст одной большой строкой.

Код:
var mySpis = app.selection[0].contents;   // скопируем выделенный тест

mySpis = mySpis.replace(/\r/g, '\n');          // заменяем разделители строк

var arrname = mySpis.match(/^.+(?=\t)/gm);   // массив имен
var arrpage = mySpis.match(/(?=\t).+$/gm);    // массив \t + число
 
Статус
Закрыто для дальнейших ответов.