Jer*_*dge 3 delphi string parsing delphi-7
我正在扩展我的一类用于存储通用大小字符串,以便为用户输入提供更灵活的值.例如,我这个类的先前版本是严格的,只允许格式为2x3或9x12.但是现在我正在制作它以便它可以支持诸如2 x 3或之类的值,9 X 12并在值发生变化时自动维护原始用户的格式.
我想弄清楚的真正问题是如何检测字符串中的一个字符是大写还是小写?因为我必须检测区分大小写.如果deliminator是'x'(小写)并且用户在值内输入'X'(大写),并且关闭区分大小写,我也需要能够找到相反的情况.
我的意思是,该Pos()功能区分大小写......
Delphi 7具有字符串的UpperCase()和LowerCase()函数.还有UpCase()用于字符.
如果我想在另一个字符串不敏感的情况下搜索子字符串,我这样做:
if Pos('needle', LowerCase(hayStack)) > 0 then
Run Code Online (Sandbox Code Playgroud)
您只需使用小写字符串文字(或常量),并在搜索之前对字符串应用小写函数.如果您要进行大量搜索,那么将一次转换为临时变量是有意义的.
这是你的情况:
a := '2 x 3'; // Lowercase x
b := '9 X 12'; // Upper case X
x := Pos('x', LowerCase(a)); // x = 3
x := Pos('x', LowerCase(b)); // x = 3
Run Code Online (Sandbox Code Playgroud)
要查看字符是高还是低,只需将其与UpCase版本进行比较:
a := 'A';
b := 'b';
upper := a = UpCase(a); // True
upper := b = UpCase(b); // False
Run Code Online (Sandbox Code Playgroud)
尝试使用这些功能(这是角色单位的一部分)
UPDATE
对于ansi版本的delphi,您可以使用这些GetStringTypeEx函数来填充每个ansi字符类型信息的列表.并将每个元素的结果与$ 0001(大写)或$ 0002(小写)值进行比较.
uses
Windows,
SysUtils;
Var
LAnsiChars: array [AnsiChar] of Word;
procedure FillCharList;
var
lpSrcStr: AnsiChar;
lpCharType: Word;
begin
for lpSrcStr := Low(AnsiChar) to High(AnsiChar) do
begin
lpCharType := 0;
GetStringTypeExA(LOCALE_USER_DEFAULT, CT_CTYPE1, @lpSrcStr, SizeOf(lpSrcStr), lpCharType);
LAnsiChars[lpSrcStr] := lpCharType;
end;
end;
function CharIsLower(const C: AnsiChar): Boolean;
const
C1_LOWER = $0002;
begin
Result := (LAnsiChars[C] and C1_LOWER) <> 0;
end;
function CharIsUpper(const C: AnsiChar): Boolean;
const
C1_UPPER = $0001;
begin
Result := (LAnsiChars[C] and C1_UPPER) <> 0;
end;
begin
try
FillCharList;
Writeln(CharIsUpper('a'));
Writeln(CharIsUpper('A'));
Writeln(CharIsLower('a'));
Writeln(CharIsLower('A'));
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
if myChar in ['A'..'Z'] then
begin
// uppercase
end
else
if myChar in ['a'..'z'] then
begin
// lowercase
end
else
begin
// not an alpha char
end;
Run Code Online (Sandbox Code Playgroud)
..或D2009 on ..
if charInSet(myChar,['A'..'Z']) then
begin
// uppercase
end
else
if charInSet(myChar,['a'..'z']) then
begin
// lowercase
end
else
begin
// not an alpha char
end;
Run Code Online (Sandbox Code Playgroud)