Delphi学习:2个不错的通配符比较函数

阳光的深深深深

阳光的深深深深

2016-01-29 14:03

Delphi学习:2个不错的通配符比较函数,Delphi学习:2个不错的通配符比较函数
 
近日在和朋友讨论 MaskMatch 时偶得2个不错的算法。
  函数1 只支持'*','?'模糊匹配。速度比采用递归算法的快近2倍,比TMask方法快很多。
  函数2 完全支持正规表达式。速度于之前的相同。(不会正规表达式的朋友慎用)



  // ===========================
  // Function 1
  // ===========================

  // Check if the string can match the wildcard. It can be used for unicode strings as well!
  // C: 2004-07-24 | M: 2004-07-24
  function MaskMatch(const aPattern, aSource: string): Boolean;
  var
  StringPtr, PatternPtr: PChar;
  StringRes, PatternRes: PChar;
  begin
  Result := False;
  StringPtr := PChar(UpperCase(aSource));
  PatternPtr := PChar(UpperCase(aPattern));
  StringRes := nil;
  PatternRes := nil;
  repeat
  repeat // ohne vorangegangenes "*"
  case PatternPtr^ of
  #0 : begin
  Result := StringPtr^ = #0;
  if Result or (StringRes = nil) or (PatternRes = nil) then Exit;
  StringPtr := StringRes;
  PatternPtr := PatternRes;
  Break;
  end;
  '*': begin
  Inc(PatternPtr);
  PatternRes := PatternPtr;
  Break;
  end;
  '?': begin
  if StringPtr^ = #0 then Exit;
  Inc(StringPtr);
  Inc(PatternPtr);
  end;
  else begin
  if StringPtr^ = #0 then Exit;
  if StringPtr^ < PatternPtr^ then
  begin
  if (StringRes = nil) or (PatternRes = nil) then Exit;
  StringPtr := StringRes;
  PatternPtr := PatternRes;



  Break;
  end else
  begin
  Inc(StringPtr);
  Inc(PatternPtr);
  end;
  end;
  end;
  until False;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/delphi/)

  repeat // mit vorangegangenem "*"
  case PatternPtr^ of
  #0 : begin
  Result := True;
  Exit;
  end;
  '*': begin
  Inc(PatternPtr);
  PatternRes := PatternPtr;
  end;
  '?': begin
  if StringPtr^ = #0 then Exit;
  Inc(StringPtr);
  Inc(PatternPtr);
  end;
  else begin
  repeat
  if StringPtr^ = #0 then Exit;
  if StringPtr^ = PatternPtr^ then Break;
  Inc(StringPtr);
  until False;
  Inc(StringPtr);
  StringRes := StringPtr;
  Inc(PatternPtr);
  Break;
  end;
  end;
  until False;
  until False;
  end;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/delphi/)



  // ===========================
  // Function 2
  // ===========================

  function _MatchPattern(aPattern, aSource: PChar): Boolean;
  begin
  Result := True;
  while (True) do
  begin
  case aPattern[0] of
  #0 : begin
  //End of pattern reached.
  Result := (aSource[0] = #0); //TRUE if end of aSource.
  Exit;
  end;

  '*': begin //Match zero or more occurances of any char.
  if (aPattern[1] = #0) then
  begin
  //Match any number of trailing chars.
  Result := True;
  Exit;
  end else
  Inc(aPattern);

  while (aSource[0] < #0) do
  begin
  //Try to match any substring of aSource.
  if (_MatchPattern(aSource, aPattern)) then
  begin
  Result := True;
  Exit;
  end;

  //Continue testing next char...
  Inc(aSource);
  end;
  end;

  '?': begin //Match any one char.
  if (aSource[0] = #0) then
  begin
  Result := False;
  Exit;
  en

展开更多 50%)
分享

猜你喜欢

Delphi学习:2个不错的通配符比较函数

Delphi
Delphi学习:2个不错的通配符比较函数

2个不错的通配符比较函数

编程语言 网络编程
2个不错的通配符比较函数

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

一个不错的随机函数

ASP
一个不错的随机函数

js几个不错的函数 $$()

Web开发
js几个不错的函数 $$()

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

一个比较实用的asp函数集合类(2)

ASP
一个比较实用的asp函数集合类(2)

Delphi的两个实用技巧(2)巧用Windows的API函数

Delphi
Delphi的两个实用技巧(2)巧用Windows的API函数

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《暖洋洋猫猫村DX》猫猫特点与狩猎指令一览

《暖洋洋猫猫村DX》猫猫特点与狩猎指令一览

《勇气默示录2》新职业驱魔师使用心得

《勇气默示录2》新职业驱魔师使用心得
下拉加载更多内容 ↓