📄 umatch.pas
字号:
unit uMatch;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DIPcre;
function Match(Pattern,S:string;DIPcre:TDIPcre):Boolean;
function MatchSentence(S:string;var StrList:TstringList):integer;
function MatchParams(S:string):string;
function MatchSingleParam(S:string;var StrList:TstringList):integer;
procedure DivideStr(S:string;divstr:string;var StrList:TstringList);
implementation
const
//方法识别
C_FUNCTION = ''
+ ' \ *(class\ +){0,1}\ * #Class Tag '
+ #10 + ' \ *(function)\ + # Function Tag '
+ #10 + ' \ *((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)\ * # 过程名称 为普通变量 '
+ #10 + ' \ *(\(.*\)){0,1}\ * #参数 '
+ #10 + ' \ *:\ * # : Tag '
+ #10 + ' \ *((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)\ * # 返回值类型 为普通变量 '
+ #10 + ' \ *;\ * # ; Tag '
+ #10 + ' \ *(?:(override|overload|virtual)\ *;){0,1}\ * #DriverType ';
//过程识别
C_PROCEDURE = ''
+ #10 +' \ *(class\ +){0,1}\ * #Class Tag '
+ #10 +' \ *(procedure)\ + # Function Tag '
+ #10 +' \ *((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)\ * # 过程名称 为普通变量 '
+ #10 +' \ *(\(.*\)){0,1}\ * #参数 '
+ #10 +' \ *;\ * # ; Tag '
+ #10 +' \ *(?:(override|overload|virtual)\ *;){0,1}\ * #DriverType ';
//析构函数
C_DESTRUCTOR =' \ *(destructor\ +)(Destroy)\ *;\ *(override)\ *;\ * ';
//构造函数
C_CONSTRUCTOR = ''
+ #10 +' \ *(constructor\ +)\ * #Class Tag '
+ #10 +' \ *(Create)\ * # Function Tag '
+ #10 +' \ *(\(.*\)){0,1}\ * #参数 '
+ #10 +' \ *;\ * # ; Tag '
+ #10 +' \ *(?:(override|overload|virtual)\ *;){0,1}\ * #DriverType ';
// 变量识别
C_VAR ='((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)';
//识别单独一个参数*
C_SINGLE_PARAM = ''
+ #10 +' \ *(var|const|out){0,1}(?: )\ * # var,const,out Tag '
+ #10 +' \ *((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)\ * # 参数名 为普通变量 '
+ #10 +' \ *:\ * # :tag '
+ #10 +' \ *((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)\ * # 参数类型 为普通变量 '
+ #10 +' \ *(?:=\ * # = 默认参数 '
+ #10 +' \ *(?:(\d|[a-z]|[A-Z]|_|\'')*)){0,1}\ * # 默认参数 ' //有转义字符'
+ #10 +' \ *;{0,1}\ * # ; tag ';
//参数串识别
C_PARAMS = ''
+ #10 +' \ *(var|const|out){0,1}(?: )\ * # var,const,out Tag '
+ #10 +' \ *(([a-z]|[A_Z]|_)([a-z]|[A_Z]|[0-9]|_)*)\ * # 参数名 为普通变量 '
+ #10 +' \ *(:)\ * # :tag '
+ #10 +' \ *(([a-z]|[A_Z]|_)([a-z]|[A_Z]|[0-9]|_)*)\ * # 参数类型 为普通变量 '
+ #10 +' \ *((=)\ * # = 默认参数 '
+ #10 +' \ *(\d|[a-z]|[A-Z]|_|\'')*){0,1}\ * # 默认参数 '
+ #10 +' \ *(\ *;\ * # ; tag '
+ #10 +' \ *(var|const|out){0,1}(?: )\ * # var,const,out Tag '
+ #10 +' \ *(([a-z]|[A_Z]|_)([a-z]|[A_Z]|[0-9]|_)*)\ * # 参数名 为普通变量 '
+ #10 +' \ *(:)\ * # :tag '
+ #10 +' \ *(([a-z]|[A_Z]|_)([a-z]|[A_Z]|[0-9]|_)*)\ * # 参数类型 为普通变量 '
+ #10 +' \ *((=)\ * # = 默认参数 '
+ #10 +' \ *(\d|[a-z]|[A-Z]|_|\'')*){0,1}\ * # 默认参数 '
+ #10 +' )* ';
//属性识别
C_ATTRIBUTE = ''
+' \ *((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)\ * '
+ #10 +' \ *:\ * # :tag '
+ #10 +' \ *((?:[a-z]|[A_Z]|_)(?:[a-z]|[A_Z]|[0-9]|_)*)\ * '
+ #10 +' \ *;\ * # 参数类型 为普通变量 ';
C_SENTENCE_TYPE : array[0..4] of string =(C_DESTRUCTOR,C_CONSTRUCTOR,C_FUNCTION,C_PROCEDURE,C_ATTRIBUTE);
C_SENTENCE_WORD_COUNT : array[0..4] of integer =(3,4,6,5,2);
function MatchSentence(S: string; var StrList: TstringList): integer;
var DIPcre:TDIPcre;
Len : integer;
I:integer;
J:integer;
begin
DIPcre := TDIPcre.Create(nil);
try
result := -1;
s:=trim(s);
for I := 0 to High(C_SENTENCE_TYPE) do
begin
if Match(C_SENTENCE_TYPE[I],S,DIPcre) then
Begin
StrList.Clear;
for J := 0 to DIPcre.SubStrCount-1 do
begin
StrList.Add(DIPcre.SubStr(J));
end;
result := I;
for j := StrList.Count to C_SENTENCE_WORD_COUNT[I] do
begin
StrList.Add('');
end;
result := I;
break;
end;
end;
finally
DIPcre.free;
end;
end;
function Match(Pattern,S: string; DIPcre:TDIPcre): Boolean;
var
SubjectStringCopy:string;
c : integer;
I : integer;
begin
result := false;
with DIPcre do
begin
DIPcre.CompileOptions :=[coCaseless,coDotAll,coExtended];
CompileMatchPattern(Pattern);
SubjectStringCopy:= S;
SetSubjectStr(SubjectStringCopy);
Match(0);
if SubStrCount > 0 then result := true;
end;
end;
function MatchParams(S:string):string;
var DIPcre:TDIPcre;
begin
DIPcre := TDIPcre.Create(nil);
result := '';
try
s:=trim(s);
if Match(C_PARAMS,S,DIPcre) then
Begin
result := DIPcre.SubStr(0);
end;
finally
DIPcre.free;
end;
end;
function MatchSingleParam(S:string;var StrList:TstringList):integer;
var
DIPcre:TDIPcre;
Len : integer;
I,J:integer;
begin
result := -1;
DIPcre := TDIPcre.Create(nil);
try
s:=trim(s);
if Match(C_SINGLE_PARAM,S,DIPcre) then
Begin
StrList.Clear;
for I := 0 to DIPcre.SubStrCount-1 do
begin
StrList.Add(DIPcre.SubStr(I));
end;
for j := StrList.Count to 4 do
begin
StrList.Add('');
end;
result := 0;
end;
finally
DIPcre.free;
end;
end;
procedure DivideStr(S:string;divstr:string;var StrList:TstringList);
var
I:Integer;
tmpStr:string;
begin
tmpStr := s;
StrList.clear;
while pos(divstr,tmpStr)>0 do
begin
StrList.add(copy(tmpstr,1,pos(divstr,tmpStr)-1));
tmpStr := copy(tmpstr,pos(divstr,tmpStr)+1,length(tmpstr));
end;
if length(trim(s))>0 then
StrList.add(trim(tmpStr));
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -