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

时间:2011-12-06 01:30:31

标签: string delphi parsing delphi-7

我正在扩展我的一类用于存储通用大小字符串,以便为用户输入提供更灵活的值。例如,我之前的此类版本是严格的,只允许使用2x39x12格式。但是现在我正在制作它以便它可以支持2 x 39 X 12等值,并在值发生变化时自动维护原始用户的格式。

我想弄清楚的真正问题是如何检测字符串中的一个字符是大写还是小写?因为我必须检测区分大小写。如果deliminator是'x'(小写)并且用户在值内输入'X'(大写),并且关闭区分大小写,我也需要能够找到相反的情况。

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

5 个答案:

答案 0 :(得分:9)

Delphi 7具有字符串的UpperCase()和LowerCase()函数。还有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

要查看某个字符是高还是低,只需将其与UpCase版本进行比较:

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

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

答案 1 :(得分:7)

尝试使用这些功能(属于Character单元的一部分)

<强>更新

对于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.

答案 2 :(得分:5)

   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;

..或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;

答案 3 :(得分:1)

JCL在JclStrings单元中具有此例程,例如CharIsUpper和CharIsLower。应该在Delphi 7中工作。

答案 4 :(得分:1)

AnsiPos()不区分大小写。您也可以强制使用大写或小写,无论用户使用UpperCase()LowerCase()输入什么内容。

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