regexp
Модератор: Модераторы
regexp
какой юнит работает с регулярными выражениями?
в смысле чем можно парсить текст?
в смысле чем можно парсить текст?
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Код: Выделить всё
regexpr- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Attid писал(а):Код: Выделить всё
regexpr
Слабоватый (хотя и компактный) модуль, самое страшное -не умеет работать с юникодом.
Поэтому пользуюсь 100% оснащенным TRegExpr с адресов http://anso.da.ru/ или http://anso.virtualave.net/
debi12345 писал(а):Attid писал(а):Код: Выделить всё
regexpr
Слабоватый (хотя и компактный) модуль, самое страшное -не умеет работать с юникодом.
Поэтому пользуюсь 100% оснащенным TRegExpr с адресов http://anso.da.ru/ или http://anso.virtualave.net/
Backreferences , Minimal matching ,Extended character classes держит?
кросплатформенность есть?
нужны одновременно под лином и гигвином ...
debi12345 писал(а):Attid писал(а):Код: Выделить всё
regexpr
Слабоватый (хотя и компактный) модуль, самое страшное -не умеет работать с юникодом.
Поэтому пользуюсь 100% оснащенным TRegExpr с адресов http://anso.da.ru/ или http://anso.virtualave.net/
По указанным адресам ошибка 404. Нашел модуль здесь.
Для тех, кто рабоает под Linux необходимо:
Код: Выделить всё
uses
Windows;
Заменить, например, на это:
Код: Выделить всё
uses
{$IFDEF Linux}
Unix;
{$ENDIF}
{$IFDEF Win32}
Windows;
{$ENDIF} Тогда модуль будет работать как надо
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
А кто-нибудь в курсе, synregexpr работает с utf-8?
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Код: Выделить всё
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;Вопрос: что не так делаю?
Спасибо.
Добавлено спустя 20 часов 39 минут 8 секунд:
dunin писал(а):...
Вопрос: что не так делаю?![]()
Спасибо.
Оказывается делаю все правильно. Получил ответ от автора юнита (Andrey V. Sorokin), надеюсь он не обидится, что открыто опубликую:
"...К сожалению, у меня так и не дошли руки реализовать конструкции (?..), после "?" можно указать только "модификаторы" (greedy, case insensitive etc), поэтому библиотека и сообщает, что не знает такого модификатора..."
Вопрос к сообществу: кто-нибудь знает альтернативные юниты/библиотеки для использования регулярных выражений?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Вопрос к сообществу: кто-нибудь знает альтернативные юниты/библиотеки для использования регулярных выражений?
Берёшь и пишешь цикл который просеивает массив и находит любое нужное тебе выражение. Нет проблем с зависимостями, ищет что надо и как надо.
Ещё есть обёртка PCRE для Delphi, но её придётся сначала портировать на FPC, и она потянет за собой динамическую библиотеку. И ещё лицензию на саму обёртку нужно уточнить. Но потенциально это полная поддержка perl-совместимых регулярных выражений.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
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+} - отладчик почему-то матерится
но при повторном нажатии F9 программа стартует. (В чем дело - сходу не фтыкаюсь. Что-нибудь похожее у кого было?)
Регулярные выражения работают. Вроде. Буду дальше разбираться... огорчило, что тянется библиотека, а она DLL, т.е. виндусовская... но нашел в коде такие вот строчки и немного повеселел.
Код: Выделить всё
const
{$IFDEF MSWINDOWS}
libpcremodulename = 'pcrelib.dll';
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
libpcremodulename = 'libpcre.so.0';
{$ENDIF UNIX}Есть надежда, что и кроссплатформенно работать будет. Короче разбираюсь пока...
зы. Odyssey, спасибо за наводку!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
