国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

DELPHI的通配符比較(第五版)

2019-11-18 18:38:06
字體:
來源:轉載
供稿:網(wǎng)友
                DELPHI的通配符比較(第五版)
           作者:李均宇        
              email:     e271828@163.net         2003.1.5
 
    我以前以為DELPHI中沒有通配符的現(xiàn)成函數(shù),后來找到了MatchesMask()。以前在未找到這個函數(shù)時我曾經(jīng)在處于自由狀態(tài)下尚有心情時便自已動手來作一個自定義的函數(shù)來實現(xiàn)這個功能。
    程序的算法較復雜,先在子串的末尾加上‘?*’,再讀取子串,查找子串中的通配符之間的字符,亦即子串中的子串,然后在源串中依次查找是否含有子串中的子串,不過實現(xiàn)起來還是費不少周折。這個函數(shù)實現(xiàn)了以下功能:
1。可能大多數(shù)情形下比遞歸算法和MatchesMask()速度高些;
2。實現(xiàn)了對星號和問號的所有情況下的正確比較;//這點也許仍需時間驗證
3。支持中文;//星號和問號要在英文下的才有效
4。支持大小寫敏感的選擇。

注意子串的開頭和末尾加不加上星號是有區(qū)別的。這個算法與用遞歸算法實現(xiàn)的函數(shù)在用棧上可能相似,但實際上是有一些不同的,對遞歸作了一些改進而成,可能在大多數(shù)情形下比遞歸過程要快一些,快多少難定。至少有這樣的估計:當通配符比較僅僅作為查找子串用時,如源串為“1111111111”子串為“*11111112*”時,使用遞歸算法的時間復雜度是O(N*M),但我寫的這個函數(shù)這時將簡化成大約調(diào)用幾次POS()函數(shù)的時間復雜度,也許可以將DELPHI中的POS()想象成"克努特--莫里斯---普拉特(KMP)算法"下的O(N+M)。少量下與遞歸算法的速度比較不明顯。當源串為連續(xù)100個1,子串為連續(xù)99個1最后加上字符2下,通過在一個1000次的循環(huán)中測試,比遞歸算法要快幾秒,比MatchesMask()函數(shù)快了二十幾秒。我實際多次測試表明三者都有時成為最快,但是MatchesMask()似乎多些時候是比較慢,而遞歸的快慢變化較大,我寫的函數(shù)可能在速度上比較平均。只不過我寫的函數(shù)僅供參考用,出了問題我可是不任何負責的噢。
function   isABClikeAX(const abc,ax:widestring):boolean; file://abc是源串,ax是子串
var
abcstart,axstart,abclength,axlength:integer;
endpartabc,endpartax,subax:widestring;
temp,abcwww,axwww:integer;
begin  file://aaa
temp:=0;
abcstart:=1;
axstart:=1;
axwww:=1;
abcwww:=1;
abclength:=length(abc);
axlength:=length(ax);
isabclikeax:=true;
while  axstart<=axlength  do//源串長度大于或等于子串時
  begin//bbb
    if  abcstart> abclength then
    begin
       if  (ax[axlength]='*') and (axlength=axstart) then   isabclikeax:=true
       else   isabclikeax:=false;//子串長過源串時
    break;
    end;
    if ax[axstart]='?' then
    begin
    inc(axstart);
    inc(abcstart);
    continue;
    end;
    if  ax[axstart]='*'  then
    begin
    inc(axstart);
    temp:=1;
    axwww:=axstart;
    abcwww:=abcstart;
    continue;
    end;
     if not((ax[axstart]='?')  or (ax[axstart]='*') )  then
    begin//ccc
    endpartax:=copy(ax,axstart,axlength-axstart+1)+'?*';
    subax:=copy(endpartax,1,min(pos('?',endpartax),pos('*',endpartax))-1);
    axstart:=axstart+min(pos('?',endpartax),pos('*',endpartax))-1;
    endpartabc:=copy(abc,abcstart,abclength-abcstart+1);
    if ((pos(subax,endpartabc)<>0) and (temp=1 )) or ((pos(subax,endpartabc)=1) and (temp=0)) then
    begin//ddd
    if temp=1  then      temp:=0;
    abcstart:=abcstart+(pos(subax,endpartabc)+length(subax)-1) ;  
    end//ddd
    else//ddd
    begin//ddd
      if (temp=0) and (axwww>1) then
      begin
      axstart:=axwww;
      abcwww:=abcwww+1;
      abcstart:=abcwww;
      temp:=1;
      continue;
      end;
    isabclikeax:=false;
    break;
    end;//ddd
    end;//ccc
  end;//bbb
  if   (result)   and  (abcstart<=abclength)  and (ax[axlength]<>'*')   then    isabclikeax:=false;//源串長過子串時
end;//aaa
FUNCTION IsLike(abc,ax:string):boolean; file://大小寫敏感的函數(shù)
begin
islike:=isABClikeAX(abc,ax);
end;
FUNCTION WideCard(abc,ax:string):boolean; file://大小寫不敏感的函數(shù)
begin
abc:=uppercase(abc);
ax:=uppercase(ax);
widecard:=isABClikeAX(abc,ax);
end;


注意USES MATH,因為用到MIN(),也可以用IF語句來代替MIN(),但不夠明白。

多謝一些網(wǎng)友給我提出的一些正確的見解,使得修改有了正確的方向。


上一篇:Delphi托盤編程實戰(zhàn)演練

下一篇:DELPHI的奇異菜單的編寫

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

主站蜘蛛池模板: 天峨县| 木里| 新宾| 伊宁县| 日土县| 嘉黎县| 井陉县| 怀来县| 宝丰县| 三原县| 财经| 建平县| 东海县| 修水县| 周口市| 上高县| 阳城县| 乌兰察布市| 济阳县| 佛冈县| 即墨市| 和田市| 镇远县| 康马县| 泰和县| 南皮县| 晋州市| 柳河县| 大安市| 肥乡县| 东莞市| 东乌珠穆沁旗| 礼泉县| 桂平市| 蓬莱市| 瑞丽市| 瑞安市| 怀集县| 阳曲县| 呼伦贝尔市| 牟定县|