我正在尝试验证一个字符串,它可以包含所有字母和数字字符,以及下划线(_)符号。
这是我到目前为止所尝试的:
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的使用都是错误的,我不确定我的方法是否是正确的解决方法?
感谢。
答案 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