仅允许字符串中的某些字符

时间:2013-09-08 11:15:02

标签: delphi delphi-xe freepascal lazarus

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

这是我到目前为止所尝试的:

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;

在拉撒路这个错误:

  

错误: arg no的不兼容类型。 1:预计会有“Set of Char”   “变体”

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

感谢。

3 个答案:

答案 0 :(得分:8)

如果字符串中包含允许

,则必须检查该字符串的每个字符。

e.g:

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;

答案 1 :(得分:3)

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中的字符(实际上是Codepoints)都可以用单个字符表示,而且某些字符可以用多种方式表示(既可以是单个字符也可以是多个字符)。 / p>

但只要您将自己限制在这些限制范围内,上述功能之一应该是有用的。如果添加“OVERLOAD”,您甚至可以同时包含两者;指令到每个函数声明的结尾,如:

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

答案 2 :(得分:2)

Lazarus / Free Pascal没有为此重载pos,但在单位结构中有“posset”变体;

http://www.freepascal.org/docs-html/rtl/strutils/posset.html

关于安德烈亚斯(恕我直言)的评论,你可以使用isemptystr。它的目的是检查只包含空格的字符串,但它基本上检查字符串是否只包含集合中的字符。

http://www.freepascal.org/docs-html/rtl/strutils/isemptystr.html