Я предполагаю, что, поскольку вы отметили вопрос XE5 и использовали индексирование с нулевым индексом, ваши строки основаны на нуле. Но, возможно, эти предположения были ошибочными.
Ваша логика в порядке, хотя ее довольно трудно читать. Код в вопросе уже делает то, что вы намереваетесь. По крайней мере, оператор if
действительно выполняет тест, который вы планируете использовать.
Давайте просто перепишите код, чтобы было легче понять. Я собираюсь положить его наши по-разному, и использовать переменный локальный цикл для представления каждого символа:
for C in AString do
begin
if not (
(('0' <= C) and (C <= '9')) // C is in range 0..9
or (('a' <= C) and (C <= 'z')) // C is in range a..z
or (('A' <= C) and (C <= 'Z')) // C is in range A..Z
or (C = '_') // C is _
) then
TRes := False;
end;
Когда написано так, что я уверен, что вы согласитесь, что она выполняет тест, который вы собираетесь.
Чтобы сделать код легче понять, однако, я бы написать IsValidIdentifierChar
функцию:
function IsValidIdentifierChar(C: Char): Boolean;
begin
Result := ((C >= '0') and (C <= '9'))
or ((C >= 'A') and (C <= 'Z'))
or ((C >= 'a') and (C <= 'z'))
or (C = '_');
end;
Как говорит @TLama, вы можете написать IsValidIdentifierChar
более сжато, используя CharInSet
:
function IsValidIdentifierChar(C: Char): Boolean;
begin
Result := CharInSet(C, ['0'..'9', 'a'..'z', 'A'..'Z', '_']);
end;
Тогда вы может построить вашу петлю поверх этой функции:
TRes := True;
for C in AString do
if not IsValidIdentifierChar(C) do
begin
TRes := False;
break;
end;
или 'Результат: = CharInSet (С, [ '0' .. '9', 'а' .. 'Z', 'A' .. 'Z', '_');' вместо от этого уродливого сочетания операторов :) – TLama
Я пропустил {$ ZEROBASEDSTRINGS}. Спасибо за остальные комментарии. –
Да, я просто предположил, что вы на мобильной платформе. Должна быть более осторожной. Для петли ваш друг здесь! –