delphi 字符串中只允许某些字符

pxiryf3j  于 2022-11-23  发布在  其他
关注(0)|答案(4)|浏览(178)

我正在尝试验证一个字符串,它可以包含所有字母和数字字符,以及下划线(_)符号。
这是我目前所尝试的:

var
  S: string;
const
  Allowed = ['A'..'Z', 'a'..'z', '0'..'9', '_'];
begin
  S := 'This_is_my_string_0123456789';

  if Length(S) > 0 then
  begin
    if (Pos(Allowed, S) > 0 then
      ShowMessage('Ok')
    else
      ShowMessage('string contains invalid symbols');
  end;
end;

在拉撒路这一错误中有:

**错误:**参数1的类型不兼容:获得“字符集”,应为“变量”

很明显,我对Pos的使用是错误的,我不确定我的方法是否正确?

  • 谢谢-谢谢
iih3973s

iih3973s1#

如果字符串包含在Allowed中,则必须检查该字符串的每个字符
例如:

var
  S: string;
const
  Allowed = ['A' .. 'Z', 'a' .. 'z', '0' .. '9', '_'];

  Function Valid: Boolean;
  var
    i: Integer;
  begin
    Result := Length(s) > 0;
    i := 1;
    while Result and (i <= Length(S)) do
    begin
      Result := Result AND (S[i] in Allowed);
      inc(i);
    end;
    if  Length(s) = 0 then Result := true;
  end;

begin
  S := 'This_is_my_string_0123456789';
  if Valid then
    ShowMessage('Ok')
  else
    ShowMessage('string contains invalid symbols');
end;
yhived7q

yhived7q2#

TYPE TCharSet = SET OF CHAR;

FUNCTION ValidString(CONST S : STRING ; CONST ValidChars : TCharSet) : BOOLEAN;
  VAR
    I : Cardinal;

  BEGIN
    Result:=FALSE;
    FOR I:=1 TO LENGTH(S) DO IF NOT (S[I] IN ValidChars) THEN EXIT;
    Result:=TRUE
  END;

如果你使用的是Unicode版本的 Delphi (看起来是这样),注意SET OF CHAR不能包含Unicode字符集中的所有有效字符。那么这个函数可能会很有用:

FUNCTION ValidString(CONST S,ValidChars : STRING) : BOOLEAN;
  VAR
    I : Cardinal;

  BEGIN
    Result:=FALSE;
    FOR I:=1 TO LENGTH(S) DO IF POS(S[I],ValidChars)=0 THEN EXIT;
    Result:=TRUE
  END;

但话又说回来,Unicode中并非所有字符(实际上是代码点)都可以用单个字符表示,有些字符可以用多种方式表示(既可以表示为单个字符,也可以表示为多个字符)。
但是只要你把自己约束在这些限制之内,上述函数中的一个应该是有用的。“指令添加到每个函数声明的末尾,如下所示:

FUNCTION ValidString(CONST S : STRING ; CONST ValidChars : TCharSet) : BOOLEAN; OVERLOAD;
FUNCTION ValidString(CONST S,ValidChars : STRING) : BOOLEAN; OVERLOAD;
pbwdgjma

pbwdgjma3#

Lazarus/Free Pascal没有为它重载pos,但是在单元strutils中有“posset”变量;
http://www.freepascal.org/docs-html/rtl/strutils/posset.html
关于Andreas的评论(恕我直言),你可以使用isemptystr。它的目的是检查只包含空格的字符串,但它基本上检查字符串是否只包含集合中的字符。
http://www.freepascal.org/docs-html/rtl/strutils/isemptystr.html

rbl8hiat

rbl8hiat4#

您可以使用正则表达式:

uses System.RegularExpressions;

if not TRegEx.IsMatch(S, '^[_a-zA-Z0-9]+$') then
  ShowMessage('string contains invalid symbols');

相关问题