GREP. Как получить найденную подстроку (выражение) в виде строки?

  • Автор темы Автор темы dhead
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

dhead

Участник
Топикстартер
Сообщения
48
Реакции
0
Задача такая:
задаю шаблон, содержащий несколько выражений.
в ChangeGrepPreference.changeTo я могу обозначить найденные выражения в виде $1 - $n
но как я могу получить какую-либо из найденных подстрок в виде строковой переменной ?
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Через присвоение переменной результата поиска (не путать с заменой). Это будет массив:
Код:
var myFindResult = myText.findGrep();
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Eugenyus,
findGrep() выдает массив из полных найденных строк, а мне нужен доступ к подстрокам-выражениям.К примеру, после выполнения кода:
Код:
myText.contents="<aaaaa>bbbb<cccccc>";
app.findGrepPreferences.findWhat ="<(.+)>.+<(.+)>";
var rez = myText.findGrep()
массив rez будет состоять из одного элемента, содержащего "<aaaaa>bbbb<cccccc>",
а мне нужны строки, находящиеся между угловыми скобками.
К примеру, в JScript от микрософт после выполнения аналогичного поиска RegExp.$1 содержит строку "aaaaa", RegExp.$2 - "cccccc".
Как получить найденные подстроки в ID - не пойму..
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Могу предложить такой вариант.
Код:
var myText1 = rez[0].contents.slice(0,rez[0].contents.indexOf(">")+1);
var myText2 = rez[0].contents.slice(rez[0].contents.lastIndexOf("<"),rez[0].contents.lastIndexOf(">")+1);
There are numerous string functions. We’ll mention a few here that are especially
useful. indexOf () and lastIndexOf () return the position of a substring in a string. If
the substring is not present in the string, the functions return –1. Here are some
examples illustrating these functions (note that JS starts counting at zero):
myString = "Charles Hoare";
myString.indexOf ("e"); //returns 5
myString.indexOf ("rl"); //returns 3
myString.lastIndexOf ("e"); //returns 12
myString.indexOf ("x"); //returns -1
The function slice () returns part of a string. It takes one or two parameters. If only
a single parameter is used, it is interpreted as “from,” so the function returns a
substring from that position to the end of the string. This single parameter can be
positive (start counting from the beginning of the string) or negative (start counting
at the end). Here are some examples:
myString = "abcdef";
myString.slice (2); //returns "cdef"
myString.slice (-2); //returns "ef"
When slice () is used with two parameters, the first one is interpreted as the start
value, and the second is the (noninclusive) stop value. The first one must be
positive; the second one can be negative. Again, some examples illustrate:
myString = "abcdefg";
myString.slice (1, 3); //returns "bc"
myString.slice (1, -2); //returns "bcde"
Scripting InDesign CS3/4 with JavaScript By Peter Kahrel
Copyright © 2009 O’Reilly Media, Inc.
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Eugenyus, я же написал: "к примеру". В реальности шаблоны гораздо сложнее, некоторые подстроки могут отсутствовать вообще ((){0,n}) и так далее. То есть slice и остальные строковые функции не решают проблему никаким образом. Неужели нет доступа к выражениям $n?
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

А вот так:
Код:
app.findGrepPreferences.findWhat ="<(.+)>.+<(.+)>";
var rez = myText.findGrep();
var myF = app.findGrepPreferences.findWhat;
String(rez[0].contents).match(myF);
var myText1 = RegExp.$1;
var myText2= RegExp.$2;
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Eugenyus, хм. почему я считал, что в адобовском jscript нет regexp-а ..?
биг сенкс
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Просто в адобовском ESTK эти классы идут в хелпе отдельной вкладкой — Core JavaScript Classes, объектная модель для каждой программы — тоже отдельный список, а принцип работы с тем же RegExp-ом в гугле нарыл. :)
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

C RegExp-ом-то все понятно, а вот Core JavaScript Classes в ESTK я и не заметил...
Только не говорите, что в CS2 RegExp тоже был :)
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

да, был


еще такой вариант

Код:
myRegExp=/(\d+)\. *(.*)/;
myRegExpResult=myRegExp.exec(currentCaption);

myRegExpResult[0] - это вся строка, myRegExpResult[n] - подвыражение
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

значит склероз
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?


Не по теме:
Двойной склероз, как выясняется: сам же использовал RegExp в CS2..
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

В общем, как выяснилось, комбинация джавовского regexp и grep - плохой вариант. Во-первых, одно и то же выражение иногда срабатывает по-разному в grep и regexp на одном тексте. Во-вторых, regexp тормозит безбожно, иногда зависая напрочь (те же шаблоны на том же тексте в MS VBscript RegExp обрабатываются за доли секунды).
Таким образом, вопрос остается актуальным. Точнее, задачу можно переформулировать: если нет возможности получить доступ к отдельным подстрокам-выражениям GREP, можно ли каким-то простым способом менять форматирование подстрок с помощью ChangeGrepPreference? Была мысль как-то помечать начало и конец выражений в changeTo(), но, к примеру, xmlTag можно применить только к полной найденной строке, а маркеров xml-тегов вроде не существует.
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Придумал однажды алгоритм, назвал его "поиск в найденном" (с). Суть его такова.
Задаем в параметре findWhat полное выражение. changeGrep(); заменяем на var myF = findGrep(); — получаем массив найденных объектов.
Меняем в параметре findWhat искомое выражение на подстроку в этом выражении.
Задаем цикл for (i=0; i<myF.length; i++){}, в котором обращаемся к созданному массиву найденных строк, через findGrep() создаем еще один массив — найденные подстроки в строке i, цепляем на этот массив еще один цикл, в котором выполняем с подстрокой нужные нам действия.
Если я правильно понял, Вам нужно только форматирование менять, в этом случае вопросов возникнуть не должно. Если должно меняться количество символов, надо будет рассматривать подробнее и глубже.
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Во-первых, замены касаются не только формата. Во-вторых, этот алгоритм не совсем корректен: при выполнении поиска подстроки в полной найденной строке неизбежны "лишние" результаты, поскольку при этом не будет учитываться соседство с другими подстроками, которое было задано в рег выражении. А в-третьих, просто удивляет невозможность более простого доступа, который, казалось бы, напрашивается сам собой.
Наверное можно сделать как-то так: в changeTo из метасимволов, обозначающих подстроки сконструировать полную ис комую строку,вставив перед и после каждой подстроки метку из "non-joiner", который не изменит распределения текста. Потом с помощью findGrep с toFind="~j.*~j" получать массив нужных подстрок, делать с ними все, что нужно, а в конце простым changeText() убрать метки.
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Поправка: toFind="~j.*?~j"
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Еще поправка, поскольку перемудрил:
1. в changeTo пишем строку, которую хотим получить на выходе, пометив нужные куски non-joiner маркерами.
2. changeGrep()
3. findWhat="~j.*~j" или findWhat="(?<=~j).*?(?=~j)" (если нужно получить текст без маркеров)
findGrep() - получаем все нужные нам куски, видим их содержимое, меняем форматирование и тд. Во втором случае необходимые элементы будут находиться в нечетных найденных строках.
4. Удаляем маркеры: findWhat = "~j", changeTo="", changeText()
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

И тут все было бы замечательно, если бы не странный глюк:
выделяем, к примеру, слово с помощью non-joiner слева и справа. редактируем слово, все замечательно - обрамление из non-joiner остается. теперь выделяем слово и применяем другой character style. После этого текст превращается в "нечто", странно ведущее себя при выделении, обрамление из non-joiner куда-то сносит и тд..
Что это? Проверьте, плиз, кто-нибудь. У меня одного такое?
 
Ответ: GREP. Как получить найденную подстроку (выражение) в виде строки?

Интересное поведение non-joiner. Есть символ (не пробел), за ним этот маркер. Кегль одинаковый. Меняем кегль у символа перед маркером (маркер не трогаем) — маркер "улетает" куда-то влево по тексту. Возвращем кегль назад — маркер возвращается. Меняем кегль у символа и маркера одновременно — всё нормально. Объяснения нет, потому как маркером этим не приходилось пользоваться.
 
Статус
Закрыто для дальнейших ответов.