За последние 24 часа нас посетили 20815 программистов и 1289 роботов. Сейчас ищут 712 программистов ...

Как поставить и удалить точку на концах строк

Тема в разделе "Регулярные выражения", создана пользователем dobrmir, 17 апр 2017.

  1. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    В Notepad++ планирую обрабатывать текст регуляркой
    \?$|!$|;$|:$
    Надо в поле замены поставить выражение, чтобы на концах найденных строк поставить дополнительную точку. Без замены этих знаков пунктуации. Каким выражением?

    Далее после того, как произведу некоторую обработку текста после этого, то надо будет снова найти эти строки, на конце которых появилась точка в дополнение к этим символам конца предложения и эту точку убрать. Конец строки не изменится, то есть это также останется на конце строки. Прошу подсказать, как это сделать наиболее экономичным по времени способом?
     
    #1 dobrmir, 17 апр 2017
    Последнее редактирование: 17 апр 2017
  2. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Я так понимаю, что ТС хочет расставить временные маркеры.
    @dobrmir, а мне больше интересно, что вы собираетесь делать в промежуточном этапе с этой строй. Возможно, что эти манипуляции и не понадобились бы.
    PHP:
    1. <?php
    2. $str_in = <<<EOL
    3. abc
    4. def;
    5. ghi!
    6. jkl
    7. mno?
    8. EOL;
    9. $str_tmp = preg_replace('/(\?|!|;|:)$/m', '$1.',$str_in); // точку добавили
    10. $str_out = preg_replace('/(\?|!|;|:)\.$/m', '$1',$str_tmp); // точку убрали
     
    dobrmir нравится это.
  4. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Есть регулярка (?<!\.)\n(?!$) склеивания разорванных строк. То есть таких, как в газетных столбцах.

    Если на конце строки точка, то она несколько по другому обрабатывает такие строки (оставляет конец предложения на конце строки для них). А для других знаков конца предложения на конце строки она не предусмотрена (хочется, чтобы для таких окончаний предложений строка тоже не склеивалась и конец предложения остался на конце строки). Раньше изучал основы PHP c редактором Codelobster PHP Editor, потом забросил и забыл, что выучил. Таким образом Ваш код в режиме отладчика сейчас применить не смогу, так как не настроено это дело и не помню, что там нужно делать. А вот, если было бы для Notepad++, то сразу бы применил, так как в нём во множестве вкладок одновременно правлю фрагменты статей или небольшие статьи целиком. Таким образом расставил бы точки на концах предложений, если они совпадают с концом строки, склеил, а потом удалил бы лишние точки после обработки.
     
    #4 dobrmir, 17 апр 2017
    Последнее редактирование: 17 апр 2017
  5. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Вот здесь прошу помочь настроить редактор для решения этой задачи.
     
  6. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Я честно говоря не особо все понял, но зачем скажем ставить именно точку, которая и так может случайно встречаться в тексте и существует вероятность ошибок, когда будете ее убирать. ИМХО для маркера лучше использовать символ, который в тексте сложно встретить, например *

    Если я правильно понял, то в notepad можно попробовать

    ищем
    (?m)(\?$|!$|;$|:$)
    заменяем на
    \1.

    чтобы удалить точку
    (?m)(\?|;|:|!)(\.)$
    \1

    должно заменить на ? ! ; : НА КОНЦАХ СТРОК ТОЛЬКО на ?. !. ;. :.
     
  7. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Насчёт * сам не додумался. Если бы была бы точка уже изначально на конце строки, то в том то и дело, что надо, чтобы она не удалилась.
    Попробовал. Точка или * ставится, только обратно не удаляется.
    Так и так делал:
    Код (Text):
    1. (?m)(\?|!|;|:)(*)$
    2. (?m)(\?|!|;|:)(\*)$
     
  8. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Значит после того как обработаешь текст это уже не КОНЕЦ СТРОКИ, поэтому и не срабатывает.
    (\?|:|;|!)(\*)
    \1

    Вот так удалит все звездочки в любых местах!
     
  9. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Так нужно, чтобы это остался конец строки. И звёздочку надо удалять не в любых местах, а именно заменять созданное сочетание. Если это не возможно, то буду искать решение по обработки несколькими регулярками одна за другой или нужно делать код для Codelobstera например, который обойдёт файлы в папке.

    Если это будет код для PHP, то надо ещё, чтобы если встречаются несколько строк заглавными буквами, то чтобы его не склеивало со строками ниже, в котором не только заглавные буквы. Это для заголовков.

    То есть, чтобы всё за одно нажатие кнопки делалось:
    1. Склеить переносы
    Мороже-
    ное
    2. Раставить *
    3. (?<!\.)\n(?!$) надо переделать, так как это для точки изготовлено, а не для *
    4. После обработки выражением предыдущего пункта удалить *
     
    #9 dobrmir, 18 апр 2017
    Последнее редактирование: 18 апр 2017
  10. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Код (Text):
    1. -\r?\n(?=\S)
    А строку замены оставить пустой
     
    dobrmir нравится это.
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Это для сайта? Разве проблемы верстки не решаются на уровне CSS?
     
  12. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Это для постов на форуме или в блоге. Например, хочется поделиться некоторыми небольшими статьями, заметками о здоровье, присланными людьми в журналы. А формат набора там многоколоночный. И чтобы сделать нормальный текст, можно поступить таким образом.
     
  13. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Также для версии на PHP нужно сделать, чтобы пустые строки не убирались.
     
  14. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Понял как сделать без заморочного варианта, по которому создал эту тему, а нормальным способом. Вот так работает (?<!\?|\.|\!)\n(?!$)
    Также нужно, чтобы не склеивались строки, набранные целиком заглавными буквами, с текстом до и после, а между собой, две строки или более, набранные целиком заглавными буквами можно чтобы склеивались, а можно чтобы не склеивались (как получится).
    Вот такой вариант (?<!\?|\.|\!|[А-Я])\n(?!$) склеивает начало строки, набранной целиком заглавными буквами, с предыдущей строкой, что не нужно. Как подправить?

    Вот образец текста:
    асрасопмиьоопр.
    смрсмтм аратматмтм чпвпипрсмр?
    араопопмоп арарсрс!
    мроапоп араопао
    ВОТ ЭТО ДА
    Надо же, бывает и так
    дела

    В Notepad++ надо включить при поиске и замене галочку «Учитывать регистр».
     
  15. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Код (Text):
    1. (?m-i)(?<!\?|\.|\!|[А-Я])\n(?![А-Я\s]*$)
     
    denis01 нравится это.
  16. dobrmir

    dobrmir Активный пользователь

    С нами с:
    8 окт 2012
    Сообщения:
    200
    Симпатии:
    2
    Благодарю. А как можно сделать, чтобы не получалось также вот таких склееных фрагментов (хотя бы, то что возможно)?

    ЗАГАДКИ ЖИВОЙ ПРИРОДЫ РАЗГОВОР ПРОДОЛЖАЕТСЯ 194 Часть первая. ИЗ ТЬМЫ ВЕКОВ .... 196 По следам неизвестных

    В ЦАРСТВЕ ПЛУТОНА Величайшая слабость ума

    В. Г. Белинскиц С незапамятных времен

    «Волшебная» рогулька История рогульки