大家都知道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;