OSDN Git Service

IdAntiFreezeを貼り付けた (ToDo #347)
[winbottle/winbottle.git] / bottleclient / RegexUtils.pas
1 unit RegexUtils;
2
3 interface
4
5 uses
6   BRegExp, Forms, Dialogs, SysUtils;
7
8 // m//k \82È\82Ç\82Å\88Í\82Ü\82ê\82Ä\82¢\82È\82¢\90³\8bK\95\\8c»\82ð\90³\82µ\82­\88Í\82ñ\82Å
9 // BRegExp\83G\83\89\81[\82Ì\94­\90\82ð\96h\82®
10 function SafeAndCheckRegExp(var ioStrExpression: String): String;
11
12 // \8fã\82Ì\8aÖ\90\94\82Å\8e©\93®\93I\82É\88Í\82ñ\82¾\95\8e\9a\97ñ\82ð\82»\82Ì\82Ü\82Ü\89æ\96Ê\95\\8e¦\82·\82é\82Æ\95Ï\82È\82Ì\82Å
13 // \8dÄ\93x\83t\83B\83\8b\83^\82µ\82Ä\8en\96\96\82·\82é\82½\82ß\82Ì\8aÖ\90\94
14 // \91O\8cã\82Ì 'm'#255 \82Æ #255'k' \82ð\8eæ\82è\8f\9c\82¢\82Ä\95Ô\82·
15 function FilterAutoRegExp(const Expression: String): String;
16
17 // s/// \82Ì\90³\8bK\95\\8c»\82ð\8dì\82Á\82Ä\83`\83F\83b\83N\82·\82é
18 function SafeAndCheckRegExpSubst(Before, After: String;
19   Flags: TReplaceFlags; out Expression: String): String;
20
21 // \90³\8bK\95\\8c»\94ÅStringReplace\81BOldPattern\82É\90³\8bK\95\\8c»\82ª\8eg\82¦\81A
22 // NewPattern\82É\1, \2\82È\82Ç\82ª\8eg\82¦\82é\88È\8aO\82Í\81A
23 // SysUtils.StringReplace\8aÖ\90\94\82Æ\82Ù\82Æ\82ñ\82Ç\93¯\82\82æ\82¤\82É\93®\8dì\82·\82é
24 function StringReplaceRegExp(const S, OldPattern, NewPattern: string;
25   Flags: TReplaceFlags): String;
26
27 var
28   RegExp: TBRegExp;
29
30 implementation
31
32 //\90³\8bK\95\\8c»\83`\83F\83b\83N\82Æ\95Ï\8dX
33 //\96ß\82è\92l\81\81\83G\83\89\81[\83\81\83b\83Z\81[\83W\81i\90³\8fí\8e\9e\82Í\8bó\81j
34 function SafeAndCheckRegExp(var ioStrExpression: String): String;
35 begin
36   Result := '';
37   try
38     RegExp.Match(ioStrExpression,' ');
39   except
40     on EBRegExpError do
41     begin
42       ioStrExpression := 'm'#255 + ioStrExpression + #255'k';
43       try
44         RegExp.Match(ioStrExpression, ' ');
45       except
46         on E: EBRegExpError do
47           Result := E.Message;
48       end;
49     end;
50   end;
51 end;
52
53 //\8e©\93®\91}\93ü\82µ\82½\90³\8bK\95\\8c»\8ew\8e¦ m[0xFF][0xFF]k \82Ì\8f\9c\8b\8e
54 function FilterAutoRegExp(const Expression: String): String;
55 begin
56   Result := Expression;
57   try
58     if RegExp.Match('m/m'#255'(.*)'#255'k/k', Result) then begin
59       Result := Copy(Result, 3, Length(Result) - 4);
60     end;
61   except
62     on EBRegExpError do ; //NOOP
63   end;
64 end;
65
66 function SafeAndCheckRegExpSubst(Before, After: String;
67   Flags: TReplaceFlags; out Expression: String): String;
68 var
69   Dummy: String;
70 begin
71   Result := '';
72   Expression := 's'#255 + Before + #255 + After + #255'k';
73   if rfIgnoreCase in Flags then
74     Expression := Expression + 'i';
75   if rfReplaceAll in Flags then
76     Expression := Expression + 'g';
77   try
78     Dummy := ' ';
79     RegExp.Subst(Expression, Dummy);
80   except
81     on E: EBRegExpError do
82     begin
83       Result := E.Message;
84     end;
85   end;
86 end;
87
88 function StringReplaceRegExp(const S, OldPattern, NewPattern: string;
89   Flags: TReplaceFlags): String;
90 var
91   Err, Pattern: String;
92 begin
93   Err := SafeAndCheckRegExpSubst(OldPattern, NewPattern, Flags, Pattern);
94   if Err <> '' then
95     raise EBRegExpError.Create(Err);
96   Result := S;
97   RegExp.Subst(Pattern, Result);
98 end;
99
100 initialization
101
102 try
103   RegExp := TBRegExp.Create;
104 except
105   ShowMessage('RegExp.dll\8aJ\8en\83G\83\89\81[');
106   Application.Terminate;
107 end;
108
109 finalization
110
111 RegExp.Free;
112
113 end.