簡體   English   中英

如何檢測字符串中的字符是大寫還是小寫?

[英]How to detect if a character from a string is upper or lower case?

我正在擴展我的一類用於存儲通用大小字符串,以便為用戶輸入提供更靈活的值。 例如,我這個類的先前版本是嚴格的,只允許格式為2x39x12 但現在我正在制作它,因此它可以支持2 x 39 X 12等值,並在值發生變化時自動保持原始用戶的格式。

我想弄清楚的真正問題是如何檢測字符串中的一個字符是大寫還是小寫? 因為我必須檢測區分大小寫。 如果deliminator是'x'(小寫)並且用戶在值內輸入'X'(大寫),並且關閉區分大小寫,我也需要能夠找到相反的情況。

我的意思是, Pos()函數區分大小寫...

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

嘗試使用這些功能(這是角色單位的一部分)

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

JCL在JclStrings單元中具有此例程,例如CharIsUpper和CharIsLower。 應該在Delphi 7中工作。

AnsiPos()不區分大小寫。 無論用戶使用UpperCase()LowerCase()輸入什么內容,您都可以強制使用大寫或小寫。

把它扔到那里因為你可能會發現它比其他(非常好的)答案簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM