我假設自從您標記問題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;
或者'Result:= CharInSet(C,['0'..'9','a'..'z','A'..'Z','_');'instead這個醜陋的運營商:) – TLama
我錯過了{$ ZEROBASEDSTRINGS}。感謝其餘的評論。 –
是的,我只是假設你是在一個移動平臺上。應該更加小心。 for in loop是你的朋友! –