您的位置:首页 > 其它

共享几个关于正则表达式的函数

2010-09-23 09:26 309 查看
自己时长会用的几个关于正则的函数、在这里存一份、、、

{
测试字符串
参数列表
Subject   等待测试的字符串
getIndex  获取的分组下标(可指定多个)
RegEx     正则匹配式
Results   返回符合表达式的字符串列表
Result    测试是否成功
****************************************
eg:
var
s:TStringList;
begin
if RegTest('<a href="/miniportal/static/album/22/album_54122_1.html" mce_href="miniportal/static/album/22/album_54122_1.html" title="单身情歌.万人舞台:越慢越美丽慢歌演唱会" class="song_title">',
'<a/x20href="(?<URL>.*?)"/x20title="(?<Album>.*?)"/x20class="song_title">',[1,2],s) then
begin
ShowMessage('ok');
end;
end;
}
function RegTest(const Subject,RegEx:string;
const getIndex:array of Integer;
var Results:TStringList;
const FindAll:Boolean=False):Boolean;overload;
var
Reg:TPerlRegEx;
nLoop:Integer;
function GetOnce(const Num:array of Integer;const RegStr:TPerlRegEx;RStr:TStringList):Boolean;
var
nLoop:Integer;
begin
try
for nLoop := 0 to High(getIndex) do//根据输入的下标来反馈
Results.Add(Reg.SubExpressions[getIndex[nLoop]]);
finally
end;
end;
begin
try
try
Reg:=TPerlRegEx.Create(nil);
Reg.Subject:=Subject;
Reg.RegEx:=RegEx;
Result:=Reg.Match;
Results.Clear;
if Result then
if FindAll then
begin
GetOnce(getIndex,Reg,Results);//先获取一次
while Reg.MatchAgain do //然后再重复获取
GetOnce(getIndex,Reg,Results);
end
else
GetOnce(getIndex,Reg,Results);
except
Result:=False;
end;
finally
FreeAndNil(Reg);
end;
end;
{
测试字符串
参数列表:
Subject   等待测试的字符串
RegEx     正则匹配式
Results   返回符合表达式的一个字符串
getIndex  获取的分组下标
Result    测试是否成功
}
function RegTest(const Subject,RegEx:string;var Results:string;const getIndex:Integer=0):Boolean;overload;
var
Reg:TPerlRegEx;
begin
try
try
Reg:=TPerlRegEx.Create(nil);
Reg.Subject:=Subject;
Reg.RegEx:=RegEx;
Result:=Reg.Match;
if Result then
Results:=Reg.SubExpressions[getIndex];
except
Result:=False;
end;
finally
FreeAndNil(Reg);
end;
end;
{
测试字符串
参数列表:
Subject   等待测试的字符串
RegEx     正则匹配式
Results   返回符合表达式的所有字符串
Result    测试是否成功
}
function RegTest(const Subject,RegEx:string;var Results:TStringList):Boolean;overload;
var
Reg:TPerlRegEx;
begin
try
Reg:=TPerlRegEx.Create(nil);
Reg.Subject:=Subject;
Reg.RegEx:=RegEx;
Results.Clear;
while Reg.MatchAgain do
begin
if Reg.MatchedExpression <> '' then
Results.Add(Reg.MatchedExpression);
end;
Result:=Results.Count > 0;
//Reg.Options:=[preCaseLess];
finally
FreeAndNil(Reg);
end;
end;
{
替换字符串
参数列表:
sString   原字符串
oString   被替换正则表达式
nString   替换为字符串
NewStr    保存结果的字符串
NoCase    是否区分大小写(True不区分、表达式含有中文慎用)
Result    是否替换成功
}
function RegReplace(const sString,oString,nString:string;var NewStr:string;const NoCase:Boolean=True):Boolean;
var
Reg:TPerlRegEx;
begin
try
Reg:=TPerlRegEx.Create(nil);
Reg.RegEx:=oString;
Reg.Subject:=sString;
Reg.Replacement:=nString;
if NoCase then Reg.Options:=[preCaseLess];
Result:=Reg.ReplaceAll;
if Result then
NewStr:=Reg.Subject;
finally
Reg.Free;
end;
end;
{*******************************************************}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: