• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Регулярные Выражения

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
Элементарно
Код:
//uses RegularExpressions
...
procedure TForm2.Button1Click(Sender: TObject);
var RegEx:TRegEx;
begin
RegEx:=TRegEx.Create('Hello');// Определяем то, что ищем, собственно регулярное выражение
 
//Далее определяем текст, в котором ищем
if RegEx.IsMatch('Hello world') then form2.Caption:='match';
end;
Теперь тоже самое, но с использованием метасимволов
Код:
procedure TForm2.Button1Click(Sender: TObject);
var RegEx:TRegEx;
begin
RegEx:=TRegEx.Create('^H[\w]+o\b');
if RegEx.IsMatch('Hello world') then form2.Caption:='match';
end;
Что написано в последнем коде? Разберем регулярное выражение

^H говорим машине, что в начале искомого текста (рег. выражения) должна быть большая латинская H

[\w]+ эта часть означает, что далее возможны любые буквенные или цифровые символы или знак подчеркивания

o\b – эта часть говорит машине, что в конце искомого слова должен быть символ o

Регулярные выражения без создания экземпляра класса
Код:
procedure TForm2.Button1Click(Sender: TObject);
var RegEx:TRegEx;
begin
if RegEx.IsMatch('Hello world','^H[\w]+o\b') then form2.Caption:='match';
end;
Трабл с русским языком

К сожалению, если написать аналогичную конструкцию с метасимволами на русском языке, то всё это удовольствие не сработает.
Код:
procedure TForm2.Button1Click(Sender: TObject);
var RegEx:TRegEx;
begin
if RegEx.IsMatch('Привет мир','^П[\w]+т\b') then form2.Caption:='match';
end;
А вот так сработает
Код:
procedure TForm2.Button1Click(Sender: TObject);
var RegEx:TRegEx;
begin
if RegEx.IsMatch('Привет мир','^П[A-Яа-я]') then form2.Caption:='match';
end;
Примеры посложнее
Отлавливаем email…
Код:
procedure TForm2.Button1Click(Sender: TObject);
var RegEx:TRegEx;
begin
if RegEx.IsMatch
('sometext someemail12@gmail.com sometext','[\w-.]+@([\w-]+(.[\w-]+)+)')
then form2.Caption:='match';
end;
Ищем http адреса
Код:
procedure TForm2.Button1Click(Sender: TObject);
var RegEx:TRegEx;
begin
if RegEx.IsMatch
('http://digital-flame.ru/',
'(http|ftp)://([\w\d-]+(.[\w\d-]+)+)(([\w\d-=?\./]+)+)*')
then form2.Caption:='match';
end;
  • (http|ftp):// – опишем возможные протоколы. Любой адрес для обращения к узлу с помощью протокола http или ftp должен начинаться с http:// или ftp:// соответственно. В скобках я указываю сначала приставку http, затем вертикальную черту, которая соответствует логическому ИЛИ и уже после нее вторую возможную приставку – ftp. В итоге наш шаблон будет срабатывать как на ссылки ftp ресурсов, так и http.
  • ([wd-]+(.[wd-]+)+) – вот таким образом можно описать адрес узла. Данная конструкция будет одинаково хорошо срабатывать и на адреса вида

    Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

    – т.е. IP адрес, как и на символьные адреса. Скобками группируем условия, т.к. если просто написать диапазон литералов в одном классе и поставить метасимвол +, то выражение не будет правильно работать. Ради эксперимента советую поупражняться и попробовать составить другой шаблон.
  • (([wd-=?\./]+)+)* – поскольку линк может вести на какой-нибудь файл, то мы обязаны это предусмотреть. В пути могут присутствовать различные символы: «/», «?», «=» и т.д. Поскольку часть из них являются метасимволами, то мы должны их экранировать – поставив перед ними еще один слеш. Установив шаблон можно открывать наш файл, запускать перебор по строкам, получая результат поиска. Для большей информативности, я показываю количество найденных совпадений в одном из label.
Пример110.jpg

Нулевая группа это все выражение в целом, далее все то, что идет в скобках. То есть в примере выше это “gmail.com” и “.com”, что соответствует частям регулярного выражения ([\w-]+(.[\w-]+)+) и (.[\w-]+)+) соответственно.
Код:
ListBox1.Items.Add(RegEx.Replace(Memo1.Text,'B'));
Интересно также, что код ниже отрабатывает даже если совпадений нет. В принципе он так и должен делать,

Код, который я использовал

Код:
procedure TForm2.Button1Click(Sender: TObject);
var RegEx: TRegEx;
    Options: TRegExOptions;
    M: TMatchCollection;
    i,j:integer;
begin
 
 //определяем необходимые опции
 Options:=[]; // Опции я так нигде и не использовал
 
 ListBox1.Items.Clear;
 //создаем объект
 RegEx:=TRegEx.Create(Edit1.Text);
 //Если найдено хотя бы обно совпадение продолжаем работу
 if RegEx.IsMatch(Memo1.Text)then
   begin
     M:=RegEx.Matches(Memo1.Text,Edit1.Text);//получаем коллекцию совпадений
     for  i:=0 to M.Count-1 do
       begin
         ListBox1.Items.Add(M.Item[i].Value);//выводим совпадение
         for j:= 0 to M.Item[i].Groups.Count-1 do //если в регулярном выражении есть группы
           ListBox1.Items.Add('   Группа '+IntToStr(j)+' '+M.Item[i].Groups[j].Value)
       end;
      //Выводим результаты работы Replace
      ListBox1.Items.Add(RegEx.Replace(Memo1.Text,Evaluator));
      ListBox1.Items.Add(RegEx.Replace(Memo1.Text,'B'));
   end;
 
end;
 
Вверх Снизу