regexp

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Mayor
новенький
Сообщения: 20
Зарегистрирован: 04.09.2007 16:55:14

regexp

Сообщение Mayor »

какой юнит работает с регулярными выражениями?

в смысле чем можно парсить текст?
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Attid писал(а):

Слабоватый (хотя и компактный) модуль, самое страшное -не умеет работать с юникодом.
Поэтому пользуюсь 100% оснащенным TRegExpr с адресов http://anso.da.ru/ или http://anso.virtualave.net/
Mayor
новенький
Сообщения: 20
Зарегистрирован: 04.09.2007 16:55:14

Сообщение Mayor »

debi12345 писал(а):
Attid писал(а):

Слабоватый (хотя и компактный) модуль, самое страшное -не умеет работать с юникодом.
Поэтому пользуюсь 100% оснащенным TRegExpr с адресов http://anso.da.ru/ или http://anso.virtualave.net/


Backreferences , Minimal matching ,Extended character classes держит?

кросплатформенность есть?

нужны одновременно под лином и гигвином ...
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Все есть. Все фичи "egrep".
Vlad-55
незнакомец
Сообщения: 1
Зарегистрирован: 10.01.2010 20:41:15

Сообщение Vlad-55 »

debi12345 писал(а):
Attid писал(а):

Слабоватый (хотя и компактный) модуль, самое страшное -не умеет работать с юникодом.
Поэтому пользуюсь 100% оснащенным TRegExpr с адресов http://anso.da.ru/ или http://anso.virtualave.net/


По указанным адресам ошибка 404. Нашел модуль здесь.
Для тех, кто рабоает под Linux необходимо:

Код: Выделить всё

uses
 Windows;

Заменить, например, на это:

Код: Выделить всё

uses
{$IFDEF Linux}
 Unix;
{$ENDIF}
{$IFDEF Win32}
 Windows;
{$ENDIF}

Тогда модуль будет работать как надо
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Vlad-55 писал(а):По указанным адресам ошибка 404. Нашел модуль здесь.

С Lazarus'ом идет этот модуль, только называется synregexpr.pas в каталоге /lazarus/components/synedit/.

Добавлено спустя 5 минут 27 секунд:
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/components/synedit/synregexpr.pas?root=lazarus&view=log
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

А кто-нибудь в курсе, synregexpr работает с utf-8?
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Код: Выделить всё

 uses
  synregexpr,
  ...
 procedure TForm1.Button1Click(Sender:TObject);
   var RegExpr: TRegExpr;
      RegExprStr: string;
 begin
  RegExprStr:='^ko(?:t|shka)'; // группировка без обратной связи
  //RegExprStr:='^ko(t|shka)'; // без группировки работает %(
  RegExpr:= tRegExpr.Create;
  RegExpr.Expression:= RegExprStr;
  if RegExpr.Exec('kot i koshka') // здесь валится
    then showmessage(
        'RegExpr.Expression = '+(RegExpr.Expression)+#13#13+
        'RegExpr.SubExprMatchCount = '+inttostr(RegExpr.SubExprMatchCount)+#13+
        'RegExpr.MatchPos[0] = '+inttostr(RegExpr.MatchPos[0])+#13+
        'RegExpr.MatchLen[0] = '+inttostr(RegExpr.MatchLen[0])+#13+
      '');
  FreeAndNil(RegExpr);
end;

111.jpg

Вопрос: что не так делаю? :|
Спасибо.

Добавлено спустя 20 часов 39 минут 8 секунд:
dunin писал(а):...
Вопрос: что не так делаю? :|
Спасибо.

Оказывается делаю все правильно. Получил ответ от автора юнита (Andrey V. Sorokin), надеюсь он не обидится, что открыто опубликую:
"...К сожалению, у меня так и не дошли руки реализовать конструкции (?..), после "?" можно указать только "модификаторы" (greedy, case insensitive etc), поэтому библиотека и сообщает, что не знает такого модификатора..."

Вопрос к сообществу: кто-нибудь знает альтернативные юниты/библиотеки для использования регулярных выражений?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Вопрос к сообществу: кто-нибудь знает альтернативные юниты/библиотеки для использования регулярных выражений?

Берёшь и пишешь цикл который просеивает массив и находит любое нужное тебе выражение. Нет проблем с зависимостями, ищет что надо и как надо.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Ещё есть обёртка PCRE для Delphi, но её придётся сначала портировать на FPC, и она потянет за собой динамическую библиотеку. И ещё лицензию на саму обёртку нужно уточнить. Но потенциально это полная поддержка perl-совместимых регулярных выражений.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Odyssey писал(а):Ещё есть обёртка PCRE для Delphi, но её придётся сначала портировать на FPC, и она потянет за собой динамическую библиотеку. И ещё лицензию на саму обёртку нужно уточнить. Но потенциально это полная поддержка perl-совместимых регулярных выражений.

Ага. Есть такое. Вот нарыл:
TPerlRegEx is a Delphi VCL wrapper around the open source PCRE library, which implements Perl-Compatible Regular Expressions.
The supplied pcrelib.dll contains PCRE 7.9, compiled with Unicode support.
The supplied OBJ files contain PCRE 7.9, compiled with Unicode support.

By default, the component uses the DLL. Using the OBJ files can trigger an internal compiler error, particularly when installing the component into a package. You can use the OBJ files by editing the compiler directives at the top of the pcre.pas file.

For more information about PCRE, please visit http://www.regular-expressions.info/pcre.html

For more information about regular expressions in general, please visit http://www.regular-expressions.info/

You can download the latest version of TPerlRegEx at http://www.regular-expressions.info/delphi.html

TPerlRegEx is licensed under the Mozilla Public License, version 1.1.

Очередной вопрос к сообществу: кто в этом понимает, в двух словах что за лицензия? Можно ли использовать бесплатно? на каких условиях?

Читаем далее:
To install this component into Delphi, open the .dpk file for your Delphi version, compile it, and install it into the IDE. The TPerlRegEx component will appear on the JGsoft page in the component palette.

Alternatively, you can create a new package or add the component to an existing package. Simply add the files PerlRegEx.pas and pcre.pas to the package.

If you prefer to instantiate TPerlRegEx at runtime instead of dropping it on a form, you don't need to install its package into the Delphi IDE. Simply add PerlRegEx to the uses clause of the units in which you want to use it. There's no need to add the pcre unit to the uses clause. This unit is used internally by TPerlRegEx.

Что и сделал. Закинул юниты поближе к проекту, добавил директиву {$MODE Delphi}{$H+} - отладчик почему-то матерится
Безимени-1.jpg

но при повторном нажатии F9 программа стартует. (В чем дело - сходу не фтыкаюсь. Что-нибудь похожее у кого было?) :?

Регулярные выражения работают. Вроде. Буду дальше разбираться... огорчило, что тянется библиотека, а она DLL, т.е. виндусовская... но нашел в коде такие вот строчки и немного повеселел.

Код: Выделить всё

const
  {$IFDEF MSWINDOWS}
  libpcremodulename = 'pcrelib.dll';
  {$ENDIF MSWINDOWS}
  {$IFDEF UNIX}
  libpcremodulename = 'libpcre.so.0';
  {$ENDIF UNIX}

Есть надежда, что и кроссплатформенно работать будет. Короче разбираюсь пока... :?

зы. Odyssey, спасибо за наводку! :wink:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить