Delphi中TStringList Indexof如何实现区分大小写,通配符模糊匹配及字符串比较区分大小写测试

大家都知道Delphi中一直以来都是不区分大小写的。但是如果有一天,你用TStringlist维护了一个id列表什么的。并且要实现区分大小写及模糊查找定位。请问要如何实现?

比如:WH445306 和Wh445306,wh445306....  在默认情况下,TStringList.indexof都认为他们是一样的。 如何区分?请看下面的测试代码

program Unit1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes,IniFiles;


type
  TStruct=packed record
    arr: array[0..50] of Char;
    str: string[50];
  end;

  var
    arr: array[0..50] of Char;
    str: string[50];
    s:string;
    //sl:TStringList;
    sl:THashedStringList;
    index:Integer;
    s1,s2:string;
    st:TStruct;

begin

  begin
    s:='Hello';
    WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));
    StrPCopy(arr, s);
    str:=s;
    WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));
    WriteLn(arr);

    WriteLn(Format('sizeof st: %d',[SizeOf(st)]));
    StrPCopy(st.arr, s);
    st.str:=s;

    WriteLn(Format('sizeof st: %d',[SizeOf(st)]));


    sl:=THashedStringList.Create;
    sl.CaseSensitive:=True;   //标记是否区分大小写
    sl.Add('WH445306');
    index:=sl.IndexOf('wh445306');
    if index<>-1   then
      sl.Add('IndexOf不区分大小写')
    else
      sl.Add('IndexOf区分大小写');
    WriteLn(sl.Text);
    s1:='WH445306';
    s2:='wh445306';
    if s1=s2 then
      WriteLn('字符比较不区分大小写')
    else
      WriteLn('字符比较区分大小写');
    sl.Free;
    Readln;  //等待键盘输入
  end;

end.

测试结果:

原来TStringList自带了一个控制开关。CaseSensitive  //标记是否区分大小写,网上没搜索到相关的资料。摸索了半天。特此记录一下备忘。同时我们也可以发现默认字符串直接比较是区分大小写的。这样用于密码验证是没有问题的。因为本身Ord('a')<>Ord('A')

CaseSensitive用来标记是否大小写敏感,AnsiCompareStr是大小写敏感的函数,AnsiCompareText则反之。另外在Help文档中还特地说明了两个函数进行判断时,小写字符是小于大写字符的,比如'a'<'A'。

而在RSA,AES,MD5,DES BASE64等加密算法中更是严格区分大小写。所以。我们应该养成一个好的代码书写习惯很重要。

sl.CaseSensitive:=True;   //标记是否区分大小写

另外记录一下TStringList.IndexOf:indexof中的通配符要如何实现?

如果要匹配字符串的某些部分而没有任何花哨的通配符(如在对另一个答案的注释中所示),则可以使用以下简单函数:

function FindMatchStr(Strings: TStrings; const SubStr: string): Integer;
begin    
  for Result := 0 to Strings.Count-1 do
    if ContainsStr(Strings[Result], SubStr) then
      exit;
  Result := -1;
end;

如果要区分大小写的匹配,则可以使用以下命令:

function FindMatchText(Strings: TStrings; const SubStr: string): Integer;
begin    
  for Result := 0 to Strings.Count-1 do
    if ContainsText(Strings[Result], SubStr) then
      exit;
  Result := -1;
end;

 也就是使用:

ContainsStr 和 ContainsText
记得Uses  StrUtils;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值