Delphi TSysCharSet,遍历字符集

y3bcpkx1  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(145)

我需要验证字符串中的某个位置是否是给定的有效字符集的一部分。我的代码无法编译,如何迭代字符集?

function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet)
  : boolean;
var
  mychar : Char;
begin
  Result := false;
  for  each mychar in ValidNextChars do
      if (CheckStr(Length(CheckStr)) =mychar ) then
        Result:= True;

end;
4si2a6ki

4si2a6ki1#

首先,我们不清楚为什么你会期望for each工作,因为 Delphi 没有for each循环,如文档中所述。文档或简单的WWW搜索显示,相应的Delphi概念是for in循环。
第二,我完全不明白你所说的CheckStr(Length(CheckStr)) = mychar是什么意思。 predicate 肯定需要包含字符索引吗?这是一个语法错误,因为CheckStr不是一个函数或类型。实际上,你只是想检查CheckStr的第CheckPos个字符是否是mychar
把所有这些加在一起,我们就得到了

function CheckCharAt(const AText: string; APos: Integer; ValidChars: TSysCharSet): Boolean;
var
  ValidChar: Char;
begin
  for ValidChar in ValidChars do
    if AText[APos] = ValidChar then
      Exit(True);
  Result := False;
end;

但请注意,这只适用于ASCII(和8位字符集),因此基本上只适用于非排版英语,因为TSysCharSetset of AnsiChar--而set of WideChar是一种不可能的类型(从SizeOf(WideChar) = 2 > 1开始)。
解决此问题的一个简单方法是使用字符的 array

function CheckCharAt(const AText: string; APos: Integer; const ValidChars: array of Char): Boolean;
begin
  for var ValidChar in ValidChars do
    if AText[APos] = ValidChar then
      Exit(True);
  Result := False;
end;

但是在现代的 Delphi 版本中,您根本不需要编写自己的函数,因为您可以简单地使用TCharHelper.IsInArray方法:

'test'[2].IsInArray(['a', 'e'])

附加信息:如果您只使用AnsiString(或只使用ASCII的string),当然应该使用in集合运算符:

function CheckCharAt(const AText: AnsiString; APos: Integer; const ValidChars: TSysCharSet): Boolean;
begin
  Result := AText[APos] in ValidChars;
end;

但是,正如我上面所说的,一组WideChar是不可能的,所以如果需要8位以上的字符,就必须放弃整个set的概念。

vxqlmq5t

vxqlmq5t2#

你不需要迭代,使用CharInSet()

function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet)
  : boolean;
begin
  Result := CharInSet(CheckStr[CheckPos],ValidNextChars);
end;

相关问题