91 lines
3.4 KiB
ObjectPascal
91 lines
3.4 KiB
ObjectPascal
|
unit RegexHelper;
|
||
|
|
||
|
interface
|
||
|
uses Global, SysUtils, StrUtils, RegularExpressionsCore;
|
||
|
|
||
|
type T2Int = record
|
||
|
i1, i2: integer;
|
||
|
end;
|
||
|
type T2Float = record
|
||
|
f1, f2: extended;
|
||
|
end;
|
||
|
type TRgb = record
|
||
|
r, g, b: integer;
|
||
|
end;
|
||
|
|
||
|
function GetStringPart(text, expression: string; group: integer; def: string): string;
|
||
|
function GetBoolPart(text, expression: string; group: integer; def: boolean): boolean;
|
||
|
function GetIntPart(text, expression: string; group: integer; def: integer): integer;
|
||
|
function GetFloatPart(text, expression: string; group: integer; def: extended): extended;
|
||
|
function Get2IntPart(text, expression: string; group: integer; def: integer): T2Int;
|
||
|
function Get2FloatPart(text, expression: string; group: integer; def: extended): T2Float;
|
||
|
function GetRGBPart(text, expression: string; group: integer; def: integer): TRGB;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
(* ***************************** Extract functions ******************************* *)
|
||
|
function GetStringPart(text, expression: string; group: integer; def: string): string;
|
||
|
var Regex: TPerlRegEx;
|
||
|
begin
|
||
|
Regex := TPerlRegEx.Create;
|
||
|
Regex.RegEx := Utf8String(expression);
|
||
|
Regex.Options := [preSingleLine, preCaseless];
|
||
|
Regex.Subject := Utf8String(text);
|
||
|
|
||
|
if Regex.Match and (Regex.GroupCount >= group) then
|
||
|
Result := String(Regex.Groups[group])
|
||
|
else Result := def;
|
||
|
|
||
|
Regex.Free;
|
||
|
end;
|
||
|
function GetBoolPart(text, expression: string; group: integer; def: boolean): boolean;
|
||
|
begin
|
||
|
Result := GetFloatPart(text, expression, group, StrToFloat(IfThen(def, '1', '0'))) <> 0;
|
||
|
end;
|
||
|
function GetIntPart(text, expression: string; group: integer; def: integer): integer;
|
||
|
var str: string;
|
||
|
begin
|
||
|
str := GetStringPart(text, expression, group, '');
|
||
|
Result := StrToIntDef(str, def);
|
||
|
end;
|
||
|
function GetFloatPart(text, expression: string; group: integer; def: extended): extended;
|
||
|
var str: string;
|
||
|
begin
|
||
|
str := GetStringPart(text, expression, group, '');
|
||
|
Result := StrToFloatDef(str, def);
|
||
|
end;
|
||
|
function Get2IntPart(text, expression: string; group: integer; def: integer): T2Int;
|
||
|
const expr : string = '(\d+)\s+(\d+)';
|
||
|
var str, s1, s2: string;
|
||
|
begin
|
||
|
str := GetStringPart(text, expression, group, IntToStr(def) + ' ' + IntToStr(def));
|
||
|
s1 := GetStringPart(str, expr, 1, IntToStr(def));
|
||
|
s2 := GetStringPart(str, expr, 2, IntToStr(def));
|
||
|
Result.i1 := StrToIntDef(s1, def);
|
||
|
Result.i2 := StrToIntDef(s2, def);
|
||
|
end;
|
||
|
function Get2FloatPart(text, expression: string; group: integer; def: extended): T2Float;
|
||
|
const expr : string = '([\d.eE+-]+)\s+([\d.eE+-]+)';
|
||
|
var str, s1, s2: string;
|
||
|
begin
|
||
|
str := GetStringPart(text, expression, group, FloatToStr(def) + ' ' + FloatToStr(def));
|
||
|
s1 := GetStringPart(str, expr, 1, FloatToStr(def));
|
||
|
s2 := GetStringPart(str, expr, 2, FloatToStr(def));
|
||
|
Result.f1 := StrToFloatDef(s1, def);
|
||
|
Result.f2 := StrToFloatDef(s2, def);
|
||
|
end;
|
||
|
function GetRGBPart(text, expression: string; group: integer; def: integer): TRGB;
|
||
|
const expr : string = '(\d+)\s+(\d+)\s+(\d+)';
|
||
|
var str, s1, s2, s3: string;
|
||
|
begin
|
||
|
str := GetStringPart(text, expression, group, IntToStr(def) + ' ' + IntToStr(def) + ' ' + IntToStr(def));
|
||
|
s1 := GetStringPart(str, expr, 1, IntToStr(def));
|
||
|
s2 := GetStringPart(str, expr, 2, IntToStr(def));
|
||
|
s3 := GetStringPart(str, expr, 3, IntToStr(def));
|
||
|
Result.r := StrToIntDef(s1, def);
|
||
|
Result.g := StrToIntDef(s2, def);
|
||
|
Result.b := StrToIntDef(s3, def);
|
||
|
end;
|
||
|
|
||
|
end.
|