Пользователь
0,0
рейтинг
1 августа 2014 в 16:07

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

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

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

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. Элементы языка регулярных выражений, подстановки в регулярных выражениях.
@poemmuse
карма
19,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (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 для перевода каретки в поле поиска или как-то так.
            • 0
              ctrl+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
      Странно)) А из какого каталога вы его запускаете?

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