Применение регулярных выражений

Автор Jako, 24 февраля 2014, 15:08

0 Пользователи и 1 гость просматривают эту тему.

JohnSUN

Цитата: celler от 25 февраля 2014, 21:52
Я это тоже читал, но у меня не получилось сделать замены...
Не переживай, я тоже, когда увидел, что вместо привычных после МСО ? и * нужно писать . и .* или .+ (по ситуации), недели три бодался с экспериментами по методу "научного тыка".

Цитата: celler от 25 февраля 2014, 21:52
сделать замены двух концов абзаца подряд на один конец абзаца.
Два и более абзацев найти нельзя, поэтому приходится идти через промежуточную замену:
$ на ~ (доллар на тильду) - конец абзаца на знак тильды
~* на ~ (тильда-звёздочка на тильду) - любое количество тильд идущих подряд (не только две) заменить на одну
~ на \n  (тильда на конец абзаца) - переразбить текст на абзацы по тильдам

Для двух других примеров принцип тот же.
Цитата: celler от 25 февраля 2014, 21:52Или вот для вышевыложенного образца текста нужно сделать всего две замены:
"точка-пробел-конец абзаца" заменить на "точка-конец абзаца"
"пробел-конец абзаца" заменить на "пробел"
(можно ещё сразу избавиться от знаков переноса, но это не важно).
Увы, не сработает. Уже в первой замене нас ждёт засада: абзац может заканчиваться еще тремя знаками препинания, но главную проблему создаёт абзац вообще без знака в конце - небрежность автора или неточность распознавания текста. Вот если бы все отступы были сделаны, скажем пятью пробелами, то да - тильда-пять-пробелов стала бы концом абзаца, а остальные тильды просто исчезли бы. Но здесь отступ был именно отступом, поиском не распознавался (хотя такая опция в поиске по формату есть)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

JohnSUN

Цитата: Jako от 25 февраля 2014, 22:40
Меняет их на Shift+Enter. Спасибо всем за советы!
Тебе спасибо за тестирование - уже вторую ошибку отловил  ;D
Везде по тексту макроса нужно заменить LINE_BREAK на PARAGRAPH_BREAK - "разрыв строки" на "конец абзаца"
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Jako

#17
Цитата: JohnSUN от 25 февраля 2014, 22:55;D
Везде по тексту макроса нужно заменить LINE_BREAK на PARAGRAPH_BREAK - "разрыв строки" на "конец абзаца"
Супер! А то бы я так до утра не заснул, решал бы задачу №2, как поменять одно на другое.  ;D

JohnSUN

Цитата: Jako от 25 февраля 2014, 23:24
как поменять одно на другое.  ;D
Сегодня об этом писал:
ЦитироватьПредставление разрыва строки, вставленного с помощью комбинации клавиш SHIFT+ВВОД. Чтобы изменить разрыв строки на разрыв абзаца, введите \n в поля Найти и Заменить на и выполните поиск и замену.
Это в пол-восьмого, когда celler'у отвечал. Пропустил?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне


VlhOwn

#20
$ - это не знак абзаца. $ - это обозначение конца строки в регулярном выражении, т.е. позиция за последним символом строки (неважно, читаемый это символ или нечитаемый), равно как и ^ - это обозначение начала строки, позиции перед первым символом.
Регулярные выражения, вообще говоря, работают только в пределах строки.

Другой вопрос, что возможность поменять знак абзаца на что-нибудь уже давно хотелось бы иметь в качестве сервисной утилиты, но это не из области регулярных выражений. Абзац - это вообще не символ, это свойство объекта.

celler

#21
Цитата: JohnSUN от 25 февраля 2014, 21:50Два и более абзацев найти нельзя, поэтому приходится идти через промежуточную замену:
$ на ~ (доллар на тильду) - конец абзаца на знак тильды
~* на ~ (тильда-звёздочка на тильду) - любое количество тильд идущих подряд (не только две) заменить на одну
~ на \n  (тильда на конец абзаца) - переразбить текст на абзацы по тильдам
Ну да, поодиночке с концами абзацев ничего не сделаешь, но можно их удалить или заменить все сразу. Однако в этом случае весь текст превращается в один абзац. Соответственно - теряется наглядность и если текст очень длинный, то может быть достигнут предел максимального количества символов в абзаце. При попытке, например, заменить большое количество тильд на табулятор, скорее всего офис обрушится. Вообще восстановление текста с помощью замен обычно не требует никакой подготовки, а просто делается с лёта путём просмотра текста и поиска в нём очередной закономерности. Таким образом общее количество шагов может быть и несколько десятков, но сложность при этом не высокая. Однако если вместо каждого элементарного шага нужно придумывать несколько многоходовых операций с превращением всего текста в один абзац, то это уже катастрофа.
Цитата: JohnSUN от 25 февраля 2014, 21:50Уже в первой замене нас ждёт засада: абзац может заканчиваться еще тремя знаками препинания, но главную проблему создаёт абзац вообще без знака в конце - небрежность автора или неточность распознавания текста.
Ничего не мешает повторить тоже самое для восклицательного и вопросительного знаков, а вот если есть абзацы без знаков препинания на конце, то это уже проблема. Хотя поиск концов абзацев по знакам препинания конечно же мера вынужденная и использование твоего макроса однозначно лучше, поскольку точка может быть на конце строки и при этом не на конце абзаца.
Цитата: JohnSUN от 25 февраля 2014, 21:50Но здесь отступ был именно отступом, поиском не распознавался
А вот здесь я не понимаю сам принцип. Почему бывает отступ без табулятора? Если это стиль абзаца, то тогда понятно, но если при обычном стандартном стиле может быть и с отступом и без отступа, то непонятно чем это обусловлено и зачем вообще нужно.

JohnSUN

Цитата: celler от 26 февраля 2014, 19:32
...я не понимаю сам принцип. Почему бывает отступ без табулятора? Если это стиль абзаца, то тогда понятно, но если при обычном стандартном стиле может быть и с отступом и без отступа, то непонятно чем это обусловлено и зачем вообще нужно.
Если честно, то я тоже не понимаю... Возможно, в угоду совместимости с документами, созданными в программе, где стили хоть и были изначально, но основной упор делался на ручное форматирование: "Чтобы изменить размер красной строки, потяните за серый треугольничек на верхней линейке... Щелкните на этот значок на панели инструментов, чтобы изменить цвет букв в слове, предложении или в нескольких выделенных абзацах..."
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Jako

Я так понимаю, макрос и переносы удалять должен? -
ЦитироватьREM Чтобы потом не вылавливать знаки переносов по всему тексту, избавимся от них прямо сейчас
REM "Переносом" считаем тире, перед которым не пробел.
Не удаляет. Я вручную - поиском/обнаружением чистил. Сейчас просто вспомнил про эти две строки.

JohnSUN

На твоих тестовых двух абзацах разорванные переносами по разным строкам слова нормально "схлопнулись". Возможно, в остальном тексте "распознавалка" воткнула другие символы, не тире...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Jako

#25
Цитата: JohnSUN от  1 марта 2014, 12:58Возможно, в остальном тексте "распознавалка" воткнула другие символы, не тире...
Да, первый пример текста полностью обрабатывается.
Закономерность такую заметил: те переносы, которые макрос пропустил (т. е. не удалял в них дефис с пробелом), находятся на строках, в которых нет знака конца абзаца.

[вложение удалено Администратором]

Jako

Подскажите пожалуйста, как можно автоматом находить и заменять слова с пробелами на них же с неразрывными пробелами? -
"в а ж н о", например.

VlhOwn

Jako, боюсь, что не получится - в офисе механизм регулярных выражений сильно выхолощен в сравнении с каноническим. Видимо, придется Вам макрос писать или другими средствами воспользоваться.

celler

Цитата: Jako от 13 марта 2014, 00:03Подскажите пожалуйста, как можно автоматом находить и заменять слова с пробелами на них же с неразрывными пробелами? -
"в а ж н о", например.
Это можно сделать такой последовательностью замен (без кавычек):
" ([:alpha:]?)[:space:]([:alpha:]?) "
" $1 $2 " (здесь второй пробел - неразрывный)

" ([:alpha:]?)[:space:]([:alpha:]?)[:space:]([:alpha:]?) "
" $1 $2 $3 " (здесь второй и третий пробелы - неразрывные)

" ([:alpha:]?)[:space:]([:alpha:]?)[:space:]([:alpha:]?)[:space:]([:alpha:]?) "
" $1 $2 $3 $4 " (здесь второй, третий и четвёртый пробелы - неразрывные)

И так далее, увеличивая каждый раз количество искомых и заменяемых знаков, пока программа больше ничего не найдёт. Неразрывный пробел нужно скопировать из Writer и использовать его в нужных местах при заменах.

Если в тексте есть слова с пробелами в самом начале абзацев, то тогда нужно сделать ещё такую замену:
"^(.) ([:alpha:]?)[:space:]"
"$1 $2 " (здесь оба пробела - неразрывные)

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

Jako

Спасибо.  :beer: VlhOwn наверно прав, такие слова искать не очень-то получается. Находит в основном только однобуквенные союзы между словами.