Регулярни изрази в Delphi

delphi

Регулярните изрази са един от основните "инструменти" на запалените Linux потребители и WEB програмисти. Проверка на данните, въведени от потребителя, бързо и лесно анализиране на html страница, намиране на сложен фрагмент в голямо парче текст - задачи, които могат да бъдат решени за няколко минути с помощта на регулярни изрази. Много програмисти вярват, че само гурута могат да ги използват. Ние не мислим така, затова ще разкажем и покажем всичко, от което се нуждаете, така че когато видите такива набори от знаци „[wd-.]+@([wd-]+([w-]+)+)“, да не се смущавате и да не изпитвате дискомфорт в долната част на корема.

Малко история

Историята на регулярните изрази започва през далечните 40-те години. Двама неврофизиолози, Уорън Маккълох и Уолтър Питс, работеха по това време, за да моделират как работи нервната система на ниво неврони. Няколко години по-късно математикът Стивън Клин успява да опише тези модели с помощта на алгебра и им дава име - регулярни множества. Така постепенно регулярните изрази започнаха да набират популярност сред програмистите. Известни хора като Кен Томпсън са написали много статии за използването на регулярни изрази за изпълнение на голямо разнообразие от задачи. И така, регулярните изрази са технология за търсене на текстови фрагменти в електронни документи, които отговарят на определени правила.

Основи на основите

Преди да започнете да използвате регулярни изрази, си струва да разберете някои понятия. Да започнем с литералите. Литерал е всеки отделен знак. Например: a, b, c, d са литерали. Мисля, че това е ясно. Да отидем по-нататък. Не можете да сготвите овесена каша само от литерали, така че метасимволите (специални знаци, които извършват някакво допълнително действие) идват на помощ. Сигурно ти се е налагалоизползвайте метасимволи, когато работите на командния ред (няма значение дали тази конзола е Windows или Unix).

Например, за да изброите файловете в определена директория на Windows, можете да използвате командата dir в cmd. Какво ще стане, ако трябва да покажа всички имена на файлове, които имат разширения html и htm? Можете да стартирате командата dir и да си чупите очите в търсене на нужните ви файлове или да използвате конструкцията dir *.htm? В този запис има два метасимвола - "*" и "?" Със звездичка показваме, че името на файла може да се състои от произволни знаци (литерали), след което дефинираме разширението и поставяме въпросителен знак, който показва, че не може да има нищо след m или който и да е символ. За нашата задача това е напълно достатъчно.

Нека се опитаме да напишем тестов пример. В полето за регулярния израз ще напишем само думата "Пример", а като тестов текст: "Това е прост пример за използване на регулярни изрази". Кликнете върху Exec и вижте как думата "Пример" е осветена във входния текст. След щракване върху сводника „ExecNext“, програмата ще се опита да потърси следващото парче текст, което съответства на шаблона. В нашия случай регулярният израз вече няма да работи, защото думата "Пример" не е никъде другаде.

Останалите метасимволи, посочени в символния клас, губят силата си и стават обикновени литерали.

Нека разгледаме такъв проблем. Има два низа, които съдържат букви и цифри. Задачата е да изберете частта от низа, в която първо има 3 последователни латински букви, последвани от числа от 3 до 6. Редовете са както следва:

Опитайте се сами да разрешите този проблем въз основа на получените знания. Моето решение ще изглежда така: "[a-z][3-6] ". Най-удобното решениеТази задача е да зададете ограничения за броя намерени знаци. И така, трябва да намерим 3 латински букви. Можете, разбира се, да напишете class[a-z]три пъти или можете просто да посочите номера им във къдрави скоби. Това направих аз. Следващото условие са числата от 3-6. Посочваме ги в класа, като не забравяме номера. Това е всичко. В резултат на търсенето на този модел"abc3456"ще бъде избрано на първия ред и"fej3456"на втория ред.

Регулярни изрази в Delphi

Delphi няма модул/компонент за работа с регулярни изрази. Според мен това е значителен пропуск на Borland (сега Code Gear Embarcadero). Не само аз мисля така, но и чушката, която кодира класа, благодарение на което пред нас се отварят неограничени възможности за използване на регулярни изрази. Така че, преди да преминете към разглеждане на практически примери, направете труда да изтеглите архива с модула и примерите от сайта на разработчиците (http://www.regexpstudio.com). Не можете да бягате толкова далеч, но просто вземете нашия диск и обединете всичко от него. Като свържете RegExpr към вашия проект (така се нарича), вие ставате достъпни за създаване на нов обект от типа TRegExpr, който има следните свойства и методи.

Съставяне на вашия списък против спам

Както обикновено, създаваме нов проект вDelphi и незабавно свързваме модула, който наскоро изтеглихме. След това ще начертаем проста форма, чийто външен вид можете да видите на съответната илюстрация.

Принципът на примера ще бъде следният. При натискане на бутона пред потребителя трябва да се появи диалогов прозорец за избор на директория. След избиране на директория контролът се прехвърля към самостоятелно написаната процедура FindFiles() . Кодът му е даден в съответната странична лента.

Код на процедурата FindFiles().

Тази процедура реализира алгоритъм за рекурсивно търсене на файлове по маска. За търсене се използва функцията FindFirst(), като параметри на която трябва да подадете:

  • Директорията, в която да търсите файлове, съответстващи на маската.
  • Атрибути на търсените файлове (системни, архивни, само за четене, всякакви).
  • Структура от тип TSearchRec, която ще съдържа резултатите от търсенето. За преминаване през всички вложени папки се използва рекурсия (процедура, която се извиква). Ако необходимият файл бъде намерен вместо директорията, тогава можете безопасно да прехвърлите работата към процедурата findMailsUtils(), която в зависимост от последния параметър ще търси или кутии за сапун, или URL адреси. Кодът за процедурата findMailUtils е даден в странична лента, чието име никога няма да ви даде представа за нейното съдържание :).
  • код на процедурата findMailUtils

    Това е всичко, в един ред описахме шаблона за търсене на кутия за сапун, не е ли страхотно? Мисля, че да, но не забравяйте, защото ако режим = 1, тогава трябва да търсите URL адреси. Шаблонът за дефиниране на връзка изглежда по-тромав:(httpftp)://([wd-]+(.[wd-]+)+)(([wd-=?\./]+)+)*. Нека отново се опитаме да се справим с вътрешностите му.

    Още един полезен пример

    При натискане на бутона за отваряне на файла, превъртете кода от правилната странична лента (и правилната странична лента се нарича "alembic") и се върнете към текста на статията за обяснения.

    аламбик

    Както в предишния пример, преди да използвате обекта TRegExpr, трябва да го инициализирате и едва след това да присвоите текста на регулярния израз. За да разрешите този проблем, можете да съставите такъв ([^s]+)s([^s]+)s([d.]+)s([d+-]+) шаблон. Както обикновено, нека се спрем по-подробно на текста на шаблона.

    Използвайте редовноизразите са удобни и не толкова трудни, колкото може да изглежда на пръв поглед. Днешните прости, но в същото време полезни примери са още едно потвърждение за това. За съжаление, в рамките на една статия не можем да ви кажем всичко за регулярните изрази. Темата е толкова голяма, че ще трябва да прочетете много умни книги, за да я изучавате. Ние вярваме във вас и знаем, че с особено желание ще разберете всичко. Междувременно можете да ми задавате въпросите си за сапуна.