oldregexpr.pp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. {
  2. This file is part of the Free Pascal packages library.
  3. Copyright (c) 2008 by Joost van der Sluis, member of the
  4. Free Pascal development team
  5. Compatibility unit for the old regexpr unit.
  6. Renaming to OldRegExpr after insertion of the newer
  7. RegExpr unit by Andrey V. Sorokin in 2011-08.
  8. See the file COPYING.FPC, included in this distribution,
  9. for details about the copyright.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. **********************************************************************}
  14. {$IFNDEF FPC_DOTTEDUNITS}
  15. unit OldRegExpr;
  16. {$ENDIF FPC_DOTTEDUNITS}
  17. {$mode objfpc}
  18. {$H-}
  19. interface
  20. {$IFDEF FPC_DOTTEDUNITS}
  21. uses
  22. System.Regex;
  23. {$ELSE FPC_DOTTEDUNITS}
  24. uses
  25. Regex;
  26. {$ENDIF FPC_DOTTEDUNITS}
  27. type
  28. tregexprflag = (
  29. ref_singleline,
  30. {** This indicates that a start of line is either the
  31. start of the pattern or a linebreak. }
  32. ref_multiline,
  33. {** The match will be done in a case-insensitive way
  34. according to US-ASCII character set. }
  35. ref_caseinsensitive);
  36. tregexprflags = set of tregexprflag;
  37. TRegExprEngine = TRegexEngine;
  38. function GenerateRegExprEngine(regexpr : PAnsiChar;flags : tregexprflags;var RegExprEngine: TRegExprEngine): boolean;
  39. function GenerateRegExprEngine(regexpr : PAnsiChar;flags : tregexprflags): TREGExprEngine;
  40. procedure DestroyRegExprEngine(var regexpr : TRegExprEngine);
  41. function RegExprPos(RegExprEngine : TRegExprEngine;p : PAnsiChar;var index,len : integer) : boolean;
  42. function RegExprReplaceAll(RegExprEngine : TRegExprEngine;const src,newstr : ansistring;var dest : ansistring) : sizeint;
  43. function RegExprEscapeStr (const S : AnsiString) : AnsiString;
  44. implementation
  45. function GenerateRegExprEngine(regexpr: PAnsiChar; flags: tregexprflags;
  46. var RegExprEngine: TRegExprEngine): boolean;
  47. var ErrorPos : Integer;
  48. ErrorCode : TRegexError;
  49. begin
  50. RegExprEngine := TRegExprEngine.Create(regexpr);
  51. if ref_multiline in flags then RegExprEngine.MultiLine:=True;
  52. if ref_caseinsensitive in flags then RegExprEngine.IgnoreCase:=True;
  53. Result := RegExprEngine.Parse(ErrorPos,ErrorCode);
  54. end;
  55. function GenerateRegExprEngine(regexpr: PAnsiChar; flags: tregexprflags
  56. ): TREGExprEngine;
  57. var r: TRegExprEngine;
  58. begin
  59. GenerateRegExprEngine(regexpr,flags,r);
  60. GenerateRegExprEngine:=r;
  61. end;
  62. procedure DestroyRegExprEngine(var regexpr: TRegExprEngine);
  63. begin
  64. if regexpr <> nil then
  65. regexpr.Free;
  66. regexpr := nil;
  67. end;
  68. function RegExprPos(RegExprEngine: TRegExprEngine; p: PAnsiChar; var index,
  69. len: integer): boolean;
  70. begin
  71. Len := 1;
  72. Result := RegExprEngine.MatchString(p,index,len);
  73. Len := Len - index;
  74. Dec(Index);
  75. if not Result then
  76. begin
  77. index := -1;
  78. len := 0;
  79. end;
  80. end;
  81. function RegExprReplaceAll(RegExprEngine: TRegExprEngine; const src,
  82. newstr: ansistring; var dest: ansistring): sizeint;
  83. begin
  84. result := RegExprEngine.ReplaceAllString(src,newstr,Dest);
  85. end;
  86. function RegExprEscapeStr(const S: AnsiString): AnsiString;
  87. var
  88. i, len : integer;
  89. s1: AnsiString;
  90. begin
  91. RegExprEscapeStr:= '';
  92. s1:='';
  93. if (S = '') then
  94. exit;
  95. len := Length (S);
  96. for i := 1 to len do
  97. begin
  98. if (S [i] in ['(','|', '.', '*', '?', '^', '$', '-', '[', '{', '}', ']', ')', '\']) then
  99. begin
  100. s1 := s1 + '\';
  101. end;
  102. s1 := s1 + S[i];
  103. end;
  104. RegExprEscapeStr:=s1;
  105. end;
  106. end.