Сверхэффективная обработка текста

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

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

    image


    Думаю, многим знакомы ситуации, когда нужно поменять формат дат в большом тексте, нормализовать отступы и пробелы в документе, подсчитать встречаемость слова в текстовом фрагменте; преобразовать xml-документ или ответ сервера в класс для десериализации, сконвертировать участок кода одного языка программирования в другой… Каждый поступает в подобных случаях по-разному: ищет соответствующие утилиты, пишет свои, а кто-то действует в лоб!

    Самые отважные начинают осваивать регулярные выражения… А ещё более смелые пробуют подстановки. Да, порог вхождения у этих инструментов очень высокий, но эффективность при грамотном применении бьёт все рекорды!

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

    Поэтому однажды я решил создать свой текстовый редактор с реджексами и подстановками.
    Называется он Poet (сайт: poet.of.by), и именно с помощью него мы будем сегодня творить маленькие чудеса!

    Подсчёт совпадений



    Как только пользователь начинает вводить образец для поиска, тотчас программа подсвечивает найденные совпадения и подсчитывает их. Более того по результатам можно перемещаться с помощью скролл-бара! Попробуйте, иногда это очень удобно! Такая функция мне не встречалось в других программах.

    Многострочный поиск с учётом специальных символов

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



    Преобразование дат

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



    Если, к примеру, мы хотим привести в документе даты формата 01.08.14 к виду 1 августа 2014, то нам потребуется небольшое регулярное выражение и простая подстановка:

    0*(?\d{1,2}).08.(?\d{1,2})

    ${Day} августа 20${Year}






    Смена форматов

    Как-то раз у меня возникла необходимость создавать C# классы по xml-ответу сервера.
    <?xml version="1.0" encoding="UTF-8"?>
    <Result>
       <Deposit>
          <Synonym>РУБЛИ</Synonym>
          <Curr>BYR - Белорусский рубль</Curr>
          <CurrCode>BYR</CurrCode>
          <State>2 - Продлен</State>
          <Sum>250,000.00</Sum>
          <Rest>88,505,000.00</Rest>
          <PercentSum>4,579,405.00</PercentSum>
          <PercentRest>4,579,405.00</PercentRest>
          <LastPercentDate>22.03.2013</LastPercentDate>
          <CurrentPercent>36.000000</CurrentPercent>
          <PercentSetupDate>18.03.2013</PercentSetupDate>
          <NextPercentDate>22.04.2013</NextPercentDate>
          <NextPercentSumma>2,650,603.00</NextPercentSumma>
          <ContractPost>1170646001265</ContractPost>
          <OpenDate>22.11.2012</OpenDate>
          <ReopenDate>22.03.2013</ReopenDate>
          <FinishDate>22.04.2013</FinishDate>
       </Deposit>
    </Result>
    


    Это также делается довольно просто:

    <(?\w+)>.+</(?\w+)>

    [XmlElement("${TagName}")]
    public string ${TagName} { get; set; }






    Сейчас моя основная задача - привлечь ваше внимание к применению регулярных выражений и подстановок а также дать почувствовать их мощь. Надеюсь, вас зацепила эта тема!

    P.S. Элементы языка регулярных выражений, подстановки в регулярных выражениях.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 36
    • +14
      <Шутка про то, что каждый программист должен написать свой текстовый редактор>

      Всё это, насколько понимаю, есть в куче других редакторов, например в SynWrite. Чем ваш редактор лучше — я не понял.

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

      Толсто Чтение мануала и ковыряние примеров — и никаких проблем. Из статьи совершенно не видно, что по этому редактору можно изучить или понять регэкспы лучше, чем по мануалам.
      • 0
        Вовсе не утверждаю, что мой редактор единственный в своём роде, но в нём есть ряд фич, которых мне не хватило в других.

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

        Вы видели где-нибудь ещё, чтобы по соответствиям поиска можно было перемещаться обычным скроллом, а не нажимать кнопки вперёд и назад?
        • +2
          Написать свой редактор, это, конечно здорово, но вот найти причины, чтобы пересесть на него, например, с SublimeText будет не просто. А про то, как парсить XML с помощью регулярных выражений хорошо написано вот тут: stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#comment1618100_1732454. Опять же, у SublimeText куча возможностей по парсингу текста и его преобразованию.
          • 0
            Возможно, Sublime достаточно хорошо расширяется с помощью плагинов, но по умолчанию не нашёл я в нём хотя бы даже многострочного поиска, не говоря уже об отображении спецсимволов в поле ввода образца для поиска. Это касается и Notepad++.

            Думаю, стоит на деле сравнить программы прежде, чем делать выводы. Поверьте, не на пустом месте я сделал новый редактор… ;)
            • +1
              просто shift+enter для перевода каретки в поле поиска или как-то так.
    • +8
      реджексами
      rejular expressions?:)
      • +1
        Ценю чувство юмора в людях :)
        На платформе .NET класс для работы с регулярными выражениями называется Regex, отсюда и «реджекс»
        • –1
          Так Regex же, не Rejex.
          • +1
            Мои познания английского не столь велики, но даже гугл читает Regex как «Реджекс» ))
            • 0
              Regex — от regular, а не от rejection или чего-то такого.
        • +1
          На самом деле, нет однозначно верного произношения regex (хотя «регэкс» все же считается основным): 1, 2, 3 и 4.

          Да, от regular expression логично произносить «регэкс».
          Но тип char, к примеру, произносится и как «кар», и как «чар», несмотря на очевидное сокращение от character.
          • 0
            Хм, не ожидал.
            • 0
              Таки да. Кстати, то же самое с названием персонажей игр — «чар».
              • 0
                У игр понять причину проще — «Чар» ассоциируется с «Чародеем», даже, если многие про себя думают «Чарактер».
                • 0
                  Не ассоциируется.
                  • 0
                    Если вы имеете в виду ассоциацию с файлами, то нужно запустить программу с администраторскими правами (Run as administrator).
                    Современные версии Windows не позволяют вносить изменения в соответствующие разделы реестра приложениям без администраторских привилегий.
                  • 0
                    del
            • +1
              Последний пример с парсингом и подстановками я делаю обычно в екселе.
              • 0
                — Не хватает функциональности текстового редактора?
                — Напишите плагин!
                • +4
                  Согласен. Notepad++ и плагины на него!
                  • 0
                    Не кроссплатформенный же.
                    • +1
                      Согласен. Sublime Text и плагины на него!
                  • +5
                    Писать велосипеды всегда интересно. Но вот заголовок «Сверхэффективная» тут явно не к месту
                    • –2
                      Лучше сначала попробовать, чем делать замечания, не оценив сути :)
                    • +1
                      Выше уже упоминал NotePad++
                      +1
                      При этом искать по регуляркам он может из коробки

                      Да и сотни других редакторов позволяют всё выше описанное.
                      Что касается многострочного поиска/замены — всегда можно скопировать многострочный текст и вставить в поле для поиска и будет работать как многострочный. Или теже регулярки с этим справляются.

                      Однако я перешел на Komodo Edit из-за перехода на Linux. В Komodo Edit тоже всё это есть из коробки. Разве что скролла нет для «удобного» перемещения. Мне удобнее нажимать F3 или Shift+F3 для перемещения по совпадениям. А для подсвечивания слов: CTRL+F, CRTL+D.
                      Скрины
                      поиск и замена
                      image
                      совпадения
                      image


                      Я привел в пример инструменты (редакторы), которыми я пользуюсь. А таких редакторов/IDE очень много и почти все они умеют подобное.

                      ЗЫ Для составления и освоения регулярок лучше всего подходит regex101.com/
                      Конечно после изучения основ.
                      • 0
                        «Мне удобнее нажимать F3 или Shift+F3 для перемещения по совпадениям.»

                        А вы пробовали скролить? Сколько раз нужно нажать на клавишу, чтобы добраться до 500-го вхождения из тысячи, если соответствия неравномерно распределены по тексту?

                        На вкус и цвет товарищей нет) Никого не заставляю пользоваться. Но прежде чем говорить, что я сделал велосипед, покатайтесь на нём… Быть может, получился мотоцикл?..
                        • 0
                          И часто такое необходимо?

                          Ради одного раз в году для поиска среди 1000 совпадений ставить новый инструмент, который не работает на Linux и лишаться тысячи других возможностей?

                          Ну и как определить по скроллу, что надо именно 42 вхождение?
                          Кто мешает поставить закладку в данном месте?
                          Кто мешает запомнить строку, и перейти к строке, вместо порядкового номера совпадения?

                          Ну и сейчас модно и удобно использовать визуальный скролл, как например в Sublime Text или Komodo Edit. На котором визуально подсвечиваются найденные места. Это намного удобнее:
                          image

                          Пока ваше предложение выглядит как трёхколёсный велосипед с квадратными колёсами. Не убедительно. Лучше действительно, как выше советовали, напишите плагины для известных IDE.
                          • 0
                            Полагаю, что у вас Линукс, поэтому вы не можете запустить Poet. Однако не стоит оценивать приложение по единственной фиче.
                            Смею заверить, что, например, докинг (разделение на несколко окошек), хоть и есть во множестве редакторов, в поэте реализован намного более удобным образом, чем обычно. А в каком редакторе вы встречали Рифмоплёт? :)

                            Насчёт визуального скролла — можно запросто уменьшить шрифт (Ctrl + колёсико мыши) и увидеть подсвеченные места, а затем также просто вернуть размер шрифта на рабочий.
                      • –1
                        Судя по описанию отличный редактор. Мне тоже постоянно не хватает подобных возможностей и тоже задумываюсь о своём велосипеде. Жду продолжения темы!
                        • –1
                          Спасибо! Ценю вашу поддержку!
                        • +2
                          Vim — и ничего более не надо :)
                          • 0
                            Боюсь, что это ещё сложнее, чем регулярные выражения :)
                          • 0
                            Люди!
                            Понимаю, что всё это мы уже видели не раз и не два… Но ведь это совершенно не значит, что новое нельзя сделать лучше!

                            Моя цель — разработать приложение совершенное в мелочах, на них даже не сразу обратишь внимание.
                            Лишь прочувствовав детали можно объективно оценить удобство и качество программы.
                            • 0
                              Сколько запускается ваш редактор на холодную на слабом компьютере (2гб RAM, какой нибудь дешевый селерон года 2008)?
                              Юзер дождется?

                              Упал на старте с
                              System.TypeInitializationException: The type initializer for 'Poet.Modules.GlobalizationManager' threw an exception. ---> System.UnauthorizedAccessException: Access to the path 'E:\$RECYCLE.BIN\S-1-5-18' is denied.
                              
                              


                              Что ему нужно в моей корзине?
                              • 0
                                Странно)) А из какого каталога вы его запускаете?

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.