Повторы в выражениях. Negative Lookbehind.

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

Dmytro

Топикстартер
15 лет на форуме
Сообщения
87
Реакции
34
Добрый день!
На сайте Бориса Кащеева и Михаила Иванюшина встретил интересное решение для вставки букв в индекс. Оригинальный пост с пояснениями находится здесь.
Для меня остается неясным одно место в выражении, а конкретно, часть с Negative Lookahead:
(?<=^(\u))(.+\r)(?!^\1)(\u)
Непонятно каким образом выбираются места на стыке абзацев, которые начинаются на разные буквы.
Коллеги, развейте тучи неведения над моей головой!
 
Ответ: как найти пустой абзац

а чего тут веять?

перевод на нормальный язык выражения

ищем
любой набор, оканчивающийся переводом строки [(.+\r)]
перед которым должна быть прописная с начала строки [(?<=^(\u))]
после которого не должно [?!] следовать с новой строки ТО ЧТО МЫ НАШЛИ выше в позитиве [^\1]
но должно быть прописной буквой (\u)

развеял? :)
 
Ответ: как найти пустой абзац

andrejk, то есть Negative Lookahead прямо не ищет прописную вначале строки, но неявно указывает на нее?
 
Ответ: как найти пустой абзац

\1 - это ссылка на то, что нашёл позивный лук

именно поэтому там в скобках в позитиве стоит \u

для того, чтобы потом конструкцией \1 сослаться на него
 
Ответ: как найти пустой абзац

До сих пор не использовал такой ход. Постараюсь применять его с пользой.
 
Ответ: как найти пустой абзац


Не по теме:
да с этим грипом... крыша едет перманентно... неправильно как это всё)))


вдогон - хоть вроде итак всё понятно -

конструкты типа \1 \2 \3 и тп - эквивалентны конструкциям замен $1 $2 $3...
но... в самой строке поиска... и ссылаются, понятным образом, на скобочные группы, предшествующие...
 
Ответ: как найти пустой абзац

да, ход интуитивно понятен
осталось найти место применения)))
 
Ответ: как найти пустой абзац

Везде, где нужны повторы в искомых выражениях.
 
Ответ: GREP в InDesign. Что и как

подскажите пожалуйста, возможно ли в grep осуществить поиск 2-х одинаковых слов, через переменную?
т. е. слово Тест, встречается в абзацах 5 раз, требуется выделить промежуток текста между двумя первыми совпадениями.
Код:
Тест((.+\r)+?)Тест

такой вариант подходит. но далее в тексте могут встречаться и другие слова, которые тоже требуется выделить с промежутком текста. Есть ли возможность вписать в формулу Похожие слова? или точное совпадение слов.
 
Ответ: GREP в InDesign. Что и как

подскажите пожалуйста, возможно ли в grep осуществить поиск 2-х одинаковых слов, через переменную?
т. е. слово Тест, встречается в абзацах 5 раз, требуется выделить промежуток текста между двумя первыми совпадениями.

1. Знак вопроса не переменная. Посмотрите в НеLp значение +? . Это наименьшее число повторений... Почитайте про нюансы.
2. В вашем случае можно использовать вот такое универсальное выражение Fr1((.*\r)*?).*?Fr2
для поиска фрагментов Fr1 Fr2 и всего что между ними. Фрагменты могут быть одинаковыми (ваше слово Тест).
Кроме того прочитайте про выражения Positive Lookbehind и Lookahead
3. Imma ранее вам указал , что несмежные фрагменты выделить за один шаг нельзя. Очень помогает в первом шаге выделить цветом найденное, а вторым шагом выделить ту часть, которая вам нужна.
 
Ответ: GREP в InDesign. Что и как

да выражение действительно очень хорошее.
спасибо.
текст как раз таки и интересует чтобы выделялся блоком.
хочется в одно выражение без покраски.
сейчас все отлично работает, остается только указать Grep не точное совпадение слова, а допустим Fr1=слово1, Fr2=слово1, или же Fr1=слово из 5 одинаковых букв, Fr2=словоиз 5 таких же букв, как то так. то есть совпадения.
но все равно спасибо за подсказки
 
Ответ: GREP в InDesign. Что и как

Вдогонку.
(?<=Test)((.*\r)*?).*?(?=Test) Это выражение для поиска между словами Test с использованием Lookbehind и Lookahead
 
Ответ: GREP в InDesign. Что и как

не точное совпадение слова, а допустим Fr1=слово1, Fr2=слово1, или же Fr1=слово из 5 одинаковых букв, Fr2=словоиз 5 таких же букв, как то так
Если я правильно понял, Вам нужно это:
http://forum.rudtp.ru/showthread.php?t=28482&page=14&p=529746&viewfull=1#post529746
 
Ответ: GREP в InDesign. Что и как

остается только указать Grep не точное совпадение слова, а допустим Fr1=слово1, Fr2=слово1, или же Fr1=слово из 5 одинаковых букв, Fr2=словоиз 5 таких же букв, как то так. то есть совпадения.

Или используйте Wildcards. например, точка означает любая литера
Или используйте литерные наборы в квадратных скобках для обозначения литер, которые могут встретиться в некоторой позиции
 
"<exp1>(<exp2>)" заменить на "exp1"("$1" + символьный стиль)

Привет.

Систематически сталкиваюсь с тем, что нужно присвоить символьный стиль чему-то, что удобно искать GREP-ом и с этим всё очевидно. Но, при этом ещё иногда бывает так, что найти то, что ищу, могу только с дополнительным (опорным) условием и применять стиль нужно не ко всей найденной подстроке, а к её части.

Пример. Верстал некий научный каталог, в котором большой раздел с описанием биологических образцов. Каждое описание вида (на один абзац): "<Учетный номер> — <название>. [комментарий/описание]. N экз. <Тип>", где N — количество экземпляров, а "Тип" — одно из: "Голотип[ы]", "Синтип[ы]", "Лектотип[ы]", "Паралектотип[ы]" и т.п. (ну, т.е. всегда "[А-Я][а-я]+типы?"). Так вот все эти типы нужно было сделать вразрядку. Само собой найти не сложно, но может получиться так, что термин, найденный по запросу, приведённому выше, будет и просто в тексте описания, а там делать вразрядку не нужно. Т.е. только тогда когда после "экз. " (опорный фрагмент). Соответственно, запрос несколько видоизменяется и вместо, например "Лектотип" находит "экз. Лектотип". Вразрядку нужно только слово "Лектотип" сделать.

Я это реализовал в два этапа. Сначала использовал для выделения терминов после указания количества экземпляров ограничивающие символы (комбинацию, не встречающуюся в тексте), а затем уже поменял ограничивающие символы и то, что между ними, на только то, что между ними с применением символьного стиля. Но вот вопрос. Можно ли как-то это сделать "одним махом"?
 
Ответ: "<exp1>(<exp2>)" заменить на "exp1"("$1" + символьный стиль)

Есть в GREP конструкция Positive lookahead. В принципе, это ваш случай.
Но лучше всего сделать так: абзацам с описанием вида присвойте собственный стиль, применив поиск по какому-то признаку (пусть экз.)
Потом разработайте grep-стили внутри этого стиля абзаца. Привойте символьный стиль с разрядкой определенным констукциям ("лектотип" и т.п.)
 
Ответ: "<exp1>(<exp2>)" заменить на "exp1"("$1" + символьный стиль)

найти
(?<=<exp1>)<exp2>

заменить
+ символьный стиль
 
Ответ: "<exp1>(<exp2>)" заменить на "exp1"("$1" + символьный стиль)

Есть в GREP конструкция Positive lookahead. В принципе, это ваш случай.
Но лучше всего сделать так: абзацам с описанием вида присвойте собственный стиль, применив поиск по какому-то признаку (пусть экз.)
Потом разработайте grep-стили внутри этого стиля абзаца. Привойте символьный стиль с разрядкой определенным констукциям ("лектотип" и т.п.)

Positive lookahead — в точку. Попробовал, отлично работает и просто заменой и GREP-стилем. Спасибо!
 
Ответ: "<exp1>(<exp2>)" заменить на "exp1"("$1" + символьный стиль)

Ну тогда жмакайте плюсик. Чтобы лучше настроение было при ответах на вопросы!
 
Ответ: как найти пустой абзац

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