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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
klimin_a_s
Постоянный гость
Сообщения: 69
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

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

Сообщение klimin_a_s »

Случаем, нет ли какой библиотеки, которая реализует механизм регулярных выражений в Атлантисе? Может фича уже реализована?
С уважением,
Климин Андрей
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

в смысле регулярных?
есть функции для вычисления формул.
function Expression (expression : string;
var errorInfo : string) : string;
например. Также есть возможность одной строкой посчитать например обороты и т.д. и т.п.
Ogeeon
Сообщения: 19
Зарегистрирован: 14 апр 2011, 11:46

Re: Регулярные выражения

Сообщение Ogeeon »

Может, 15 лет спустя хотя бы в планах появилась реализация RegExp-ов в Vip?
Irina_
Местный житель
Сообщения: 547
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Регулярные выражения

Сообщение Irina_ »

Здравствуйте.
Недавно пришлось воспользоваться в FR ф-цией CompileVipExpression.
Примеры:
CompileVipExpression( 'sGetTune( ''BOSS'' )' )
CompileVipExpression(Format('dTXOGetField( ''Persons'', ''AppDate'', %d)', [<frPsn."NREC">]))
CompileVipExpression(Format('sGetAttr(coPrikaz, %d, ''test'')', [<FRPrikazR."NREC">]))
KVS
Новичок
Сообщения: 27
Зарегистрирован: 03 фев 2020, 10:38

Re: Регулярные выражения

Сообщение KVS »

Появилась, но несколько урезанная.

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

Function VIPRegExpr(ARegExpr : String,  AInputStr : String) : Boolean; external 'WordLib.dll';
На входе регулярка и строка, на выходе результат: соответствует строка регулярке или нет.

У себя реализовали вместо этого дела три функции:

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

Function IsMatch(s: String, p: String) : Boolean; external 'RegExp.dll#IsMatch'; 
Function Match(s: String, p: String, d: Char) : String; external 'RegExp.dll#Match'; 
Function Replace(s: String, p: String, rs:String) : String; external 'RegExp.dll#Replace'; 
Реализация на делфи 13.0

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

library GalRegEX;

uses
  System.SysUtils,
  System.RegularExpressions;

{$R *.res}
//Функция проверяет соответствие полученной строки s на соответствие RE p
function IsMatch(s, p : ShortString): boolean; export;
begin
  result := false;
  if (s = '') or (p = '') then exit;

  result := TRegEx.IsMatch(s,p);
end;

//Функция возвращает из строки s все совпадения с RE p разделенных разделителем d
function Match(s, p : ShortString; d : Char): ShortString; export;
begin

  result := '';
  if (s = '') or (p = '') then exit;

  var CurMatch : TMatch;
  for CurMatch in TRegEx.Matches(s, p) do
  begin
    result := result + d + CurMatch.Value;
  end;

  if result <> '' then
    System.Delete(result,1,1);
end;

//Функция возвращает строку s, где все совпадения с RE p заменены на rs
function Replace(s, p, rs : ShortString): ShortString; export;
begin
  result := '';
  if (s = '') or (p = '') then exit;
  result := TRegEx.Replace(s,p,rs);
end;

exports
  IsMatch name 'IsMatch'
, Match   name 'Match'
, Replace name 'Replace';

begin
end.
Ogeeon
Сообщения: 19
Зарегистрирован: 14 апр 2011, 11:46

Re: Регулярные выражения

Сообщение Ogeeon »

KVS, большое Вам спасибо за идею!
KVS
Новичок
Сообщения: 27
Зарегистрирован: 03 фев 2020, 10:38

Re: Регулярные выражения

Сообщение KVS »

Ogeeon писал(а): 20 июн 2023, 09:32 KVS, большое Вам спасибо за идею!
Пожалуйста.
Только обратите внимание, что VIP'овский тип String соответствует делфовому типу ShortString, более длинные строковые типы я не нашел, как пробросить в экспортируемые функции DLL, поэтому наш вариант реализации работает только со строками длиной до 255 символов.
Ответить