Как определить, является ли символ из строки прописными или строчными? - PullRequest
3 голосов
/ 06 декабря 2011

Я расширяю свой класс для хранения строк общего размера, чтобы обеспечить более гибкие значения для пользовательского ввода.Например, моя предыдущая версия этого класса была строгой и допускала только формат 2x3 или 9x12.Но теперь я делаю так, чтобы он мог поддерживать такие значения, как 2 x 3 или 9 X 12 и автоматически поддерживать форматирование исходного пользователя, если значения меняются.

Реальный вопрос, который я пытаюсь выяснитьэто просто, как определить, является ли один символ из строки в верхнем или нижнем регистре?Потому что я должен определить чувствительность к регистру.Если разделитель равен «x» (нижний регистр), а пользователь вводит «X» (верхний регистр) внутри значения, а чувствительность к регистру отключена, мне нужно также найти противоположный случай.

Я имею в виду, функция Pos() чувствительна к регистру ...

Ответы [ 5 ]

9 голосов
/ 06 декабря 2011

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
7 голосов
/ 06 декабря 2011

попробуйте использовать эти функции (которые являются частью Символ )

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.
5 голосов
/ 06 декабря 2011
   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 на ..

   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;
1 голос
/ 06 декабря 2011

AnsiPos() без учета регистра. Вы также можете использовать верхний или нижний регистр независимо от того, что вводит пользователь, используя UpperCase() и LowerCase().

Просто добавьте это, потому что вы можете найти это намного проще, чем другие (очень хорошие) ответы.

1 голос
/ 06 декабря 2011

В JCL есть процедуры для этого в модуле JclStrings, например, CharIsUpper и CharIsLower. Должен работать в Delphi 7.

...