String 如何检测字符串中的字符是大写还是小写?

String 如何检测字符串中的字符是大写还是小写?,string,delphi,parsing,delphi-7,String,Delphi,Parsing,Delphi 7,我正在扩展一个用于存储通用大小字符串的类,以允许用户输入更灵活的值。例如,我以前版本的这个类非常严格,只允许使用2x3或9x12格式。但现在我正在制作它,以便它能够支持诸如2x3或9x12之类的值,并且在值发生更改时自动维护原始用户的格式 我想弄清楚的真正问题是如何检测字符串中的一个字符是大写还是小写?因为我必须检测是否区分大小写。如果删除器是“x”(小写),用户在值中输入“x”(大写),并且大小写敏感度被关闭,那么我需要能够找到相反的大小写 我的意思是,Pos()函数区分大小写…尝试使用这些函

我正在扩展一个用于存储通用大小字符串的类,以允许用户输入更灵活的值。例如,我以前版本的这个类非常严格,只允许使用
2x3
9x12
格式。但现在我正在制作它,以便它能够支持诸如
2x3
9x12
之类的值,并且在值发生更改时自动维护原始用户的格式

我想弄清楚的真正问题是如何检测字符串中的一个字符是大写还是小写?因为我必须检测是否区分大小写。如果删除器是“x”(小写),用户在值中输入“x”(大写),并且大小写敏感度被关闭,那么我需要能够找到相反的大小写

我的意思是,
Pos()
函数区分大小写…

尝试使用这些函数(它们是单元的一部分)

更新

对于ansi版本的delphi,您可以使用函数用每个ansi字符类型信息填充列表。并将每个元素的结果与$0001(大写)或$0002(小写)值进行比较

使用
窗户,
SysUtils;
变量
LAnsiChars:字的数组[AnsiChar];
程序填充列表;
变量
lpSrcStr:AnsiChar;
lpCharType:Word;
开始
对于lpSrcStr:=低(AnsiChar)到高(AnsiChar)do
开始
lpCharType:=0;
GetStringTypeExA(区域设置\用户\默认值,CT \ CTYPE1,@lpSrcStr,SizeOf(lpSrcStr),lpchartType);
LAnsiChars[lpSrcStr]:=lpCharType;
结束;
结束;
函数(常数C:AnsiChar):布尔;
常数
C1_较低=$0002;
开始
结果:=(LAnsiChars[C]和C1_更低)0;
结束;
函数(常数C:AnsiChar):布尔;
常数
C1_上=0001美元;
开始
结果:=(LAnsiChars[C]和C1_UPPER)0;
结束;
开始
尝试
填充列表;
书面形式(a);
书面形式(A);
书面形式(a);
书面形式(A);
除了
关于E:Exception-do
Writeln(E.Classname,“:”,E.Message);
结束;
Readln;
结束。
..或D2009上

   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;

JCL在JclStrings单元中有这方面的例程,例如ChariSuper和ChariSleer。应在Delphi 7中工作。

AnsiPos()
不区分大小写。您还可以强制使用大写或小写,而不考虑用户使用
UpperCase()
LowerCase()
输入的内容

你可能会发现它比其他(非常好的)答案简单得多,所以就把它扔到那里吧。

Delphi 7有用于字符串的大写()和小写()函数。还有用于字符的UpCase()

如果我想在另一个字符串大小写中不敏感地搜索子字符串,我会执行以下操作:

if Pos('needle', LowerCase(hayStack)) > 0 then
您只需使用小写字符串文字(或常量),并在搜索之前对字符串应用小写函数。如果要进行大量搜索,只需将一次转换为临时变量是有意义的

这是您的案例:

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
要查看字符是大写还是小写,只需将其与大写版本进行比较:

a := 'A';
b := 'b';

upper := a = UpCase(a); // True
upper := b = UpCase(b); // False

性格在Delphi7中似乎找不到-这是在更新的版本中吗?(我忘了标记delphi-7)请始终添加您的delphi版本。+1,或者您可以尝试使用and来确定字符大小写,但这是基于区域设置的。回答很好,这意味着我必须循环遍历每个字符,并跟踪
if(HasL)和(非HasD),然后。。。否则如果(HasL)和(HasD)和(非HasR),则等等。。。但总的来说,我应该这样做:我想强制执行,但我们的用户社区非常坚持按他们的方式执行:PYou不必强制执行输入或存储的格式,只需幕后操作值所使用的格式!伟大的“大海捞针”例子:P看起来这也是一个更容易做到的方法。本例中不涉及解析,只需1)删除空格,2)找到删除器,3)在删除器前后获取文本,4)尝试将左右文本转换为数字。我以前的方法是逐字符循环,我从PHP文档中窃取了针线/干草堆的类比。在这种情况下,它比foo/bar更好。:)
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
a := 'A';
b := 'b';

upper := a = UpCase(a); // True
upper := b = UpCase(b); // False