Delphi遍历TSysCharSet实现字符串指定位置字符有效性校验
问题说明
原代码编译失败的核心原因有两点:
TSysCharSet是Delphi原生集合类型,不支持for each in语法直接遍历- 字符串取字符的语法写错:Delphi中访问字符串指定位置索引用
[],不是(),且代码未使用传入的CheckPos参数,也未做边界校验,存在逻辑错误和越界风险。
最优实现(无需遍历)
集合类型原生支持in运算符直接判断元素归属,不需要手动遍历集合,性能最高,代码如下:
function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet) : boolean; begin Result := False; // 校验位置合法性,避免越界 if (CheckPos < 1) or (CheckPos > Length(CheckStr)) then Exit; // 直接判断目标字符是否在有效字符集内 Result := CheckStr[CheckPos] in ValidNextChars; end;
手动遍历TSysCharSet的正确写法
如果有遍历集合内所有字符的需求,不能用for each语法,需要遍历字符类型的完整取值范围,逐个判断字符是否属于当前集合,示例代码如下:
function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet) : boolean; var mychar : Char; TargetChar: Char; begin Result := False; // 边界校验 if (CheckPos < 1) or (CheckPos > Length(CheckStr)) then Exit; TargetChar := CheckStr[CheckPos]; // 遍历所有可能的字符值,判断是否在集合内 for mychar := Low(Char) to High(Char) do begin if (mychar in ValidNextChars) and (mychar = TargetChar) then begin Result := True; Exit; // 匹配到直接返回,终止遍历 end; end; end;
版本适配提示:Delphi 2009之前的版本中
TSysCharSet定义为set of AnsiChar,仅支持0-255范围的ANSI字符;后续Unicode版本中TSysCharSet对应宽字符集合,遍历范围随Char类型自动适配即可。
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

