DELPHI的萬用字元比較(第五版) (轉)
的萬用字元比較(第五版)
作者:李均宇
e: ">e271828@163.net .1.5
我以前以為DELPHI中沒有萬用字元的現成,後來找到了MatchesMask()。以前在未找到這個函式時我曾經在處於自由狀態下尚有心情時便自已動手來作一個自定義的函式來實現這個功能。
的演算法較複雜,先在子串的末尾加上‘?*’,再讀取子串,查詢子串中的萬用字元之間的字元,亦即子串中的子串,然後在源串中依次查詢是否含有子串中的子串,不過實現起來還是費不少周折。這個函式實現了以下功能:
1。可能大多數情形下比遞迴演算法和MatchesMask()速度高些;
2。實現了對星號和問號的所有情況下的正確比較;//這點也許仍需時間驗證
3。支援中文;//星號和問號要在英文下的才有效
4。支援大小寫敏感的選擇。
注意子串的開頭和末尾加不加上星號是有區別的。這個演算法與用遞迴演算法實現的函式在用棧上可能相似,但實際上是有一些不同的,對遞迴作了一些改進而成,可能在大多數情形下比遞迴過程要快一些,快多少難定。至少有這樣的估計:當萬用字元比較僅僅作為查詢子串用時,如源串為“1111111111”子串為“*11111112*”時,使用遞迴演算法的時間複雜度是O(N*M),但我寫的這個函式這時將簡化成大約幾次POS()函式的時間複雜度,也許可以將DELPHI中的POS()想象成"克努特--莫里斯---普拉特(KMP)演算法"下的O(N+M)。少量下與遞迴演算法的速度比較不明顯。當源串為連續100個1,子串為連續99個1最後加上字元2下,透過在一個1000次的迴圈中測試,比遞迴演算法要快幾秒,比MatchesMask()函式快了二十幾秒。我實際多次測試表明三者都有時成為最快,但是MatchesMask()似乎多些時候是比較慢,而遞迴的快慢變化較大,我寫的函式可能在速度上比較平均。只不過我寫的函式僅供參考用,出了問題我可是不任何負責的噢。
function isABClikeAX(const abc,ax:wstring):boolean; 是源串,ax是子串
var
abcstart,axstart,abclength,axlength:integer;
endpartabc,endpartax,subax:widestring;
temp,abcwww,axwww:integer;
begin
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; 小寫敏感的函式
begin
islike:=isABClikeAX(abc,ax);
end;
FUNCTION WideCard(abc,ax:string):boolean; 小寫不敏感的函式
begin
abc:=uppercase(abc);
ax:=uppercase(ax);
widecard:=isABClikeAX(abc,ax);
end;
注意USES MATH,因為用到MIN(),也可以用IF語句來代替MIN(),但不夠明白。
多謝一些網友給我提出的一些正確的見解,使得修改有了正確的方向。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993269/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DELPHI的萬用字元比較 (轉)字元
- excel 字元比較函式Excel字元函式
- JavaScript 比較相同的字元返回falseJavaScript字元False
- Delphi中字串比較大小 VS Oracle-SQL中字串比較大小字串OracleSQL
- mysql字元型別varchar()比較MySql字元型別
- 關於Oracle字元型別的比較Oracle字元型別
- java位元組流和字元流的比較哦啊Java字元
- GML、SVG、VML的比較 (轉)SVG
- 比較perl模組的版本(轉)
- 流行語言的比較 (轉)
- Linux萬用字元(轉)Linux字元
- 前端比較實用的CSS前端CSS
- Hibernate與 MyBatis的比較(轉)MyBatis
- 分享一種比較萬能的居中方式
- 比較 python & perl(轉)Python
- 比較實用的js集錦JS
- 比較實用的選股技巧
- Oracle與SQL Server在企業應用中的比較(轉)OracleSQLServer
- ASP.NET 與 JAVA 的比較 (轉)ASP.NETJava
- Visual C++與Delphi/C++Builder之比較 (轉)C++UI
- Linux Shell 萬用字元、元字元、轉義符使用Linux字元
- 用Delphi編寫DelTree程式 (轉)
- 用DELPHI開發DirectX遊戲 (轉)遊戲
- (轉)ORACLE 中IN和EXISTS比較Oracle
- Closure的應用和替代方案比較
- 用PHP連mysql和oracle資料庫效能比較(轉)PHPMySqlOracle資料庫
- Oracle將字元編碼從GBK轉到UTF8,如何操作比較穩妥?Oracle字元
- Python解惑:整數比較 is ==的比較Python
- 裸裝置、字元裝置、塊裝置不全面比較字元
- 字串大小寫轉換和字串的比較字串
- Perl程式與c程式速度的比較(轉)C程式
- 比較四種主要的Linux版本(轉)Linux
- 【轉載】webservice框架xfire和axis的比較Web框架
- 有哪些比較實用的全球http代理HTTP
- Linux運維比較實用的工具Linux運維
- 樹形控制元件比較 (轉)控制元件
- Integer的比較
- 用Delphi處理公曆到農曆的轉換 (轉)