
28.07.2010, 15:50
|
Активный
|
|
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
|
|
Так будет точнее, пожалуй :
Код:
if MyPOS2_SubStr('sin;cos', Edit1.Text, ';,/ \.:-',true)>0 then begin
Showmessage(...);
end;
Код:
function MyPOS2_SubStr(sSubStr, Sx : String; sSepSubStr : String=';'; YesUpcase : boolean = true) : integer;
Var
c1,c2,i : integer;
sStr : String;
List : TStrings;
begin
Result:=0;
if (length(Sx)>0) and (length(sSubStr)>0) then begin
if YesUpcase then begin
sSubStr:=AnsiUpperCase(sSubStr);
Sx:=AnsiUpperCase(Sx);
end;
c1:=Get_CountWords_In_String(Sx, sSepSubStr, false);
c2:=Get_CountWords_In_String(sSubStr, sSepSubStr, false);
if (c1>0) and (c2>0) then begin
List:=TStringList.Create;
TRY
i:=0;
while i<c1 do
begin
i:=i+1;
sStr:=Get_Word_From_String(Sx, i, sSepSubStr, false);
if length(sStr)>0 then begin
List.Add(sStr);
end;
end;
i:=0;
while i<c2 do
begin
i:=i+1;
sStr:=Get_Word_From_String(sSubStr, i, sSepSubStr, false);
if length(sStr)>0 then begin
Result:=List.IndexOf(sStr);
if Result>=0 then begin
Result:=Result+1;
i:=c2+1;
end;
end;
end;
FINALLY
if List<>nil then begin
List.Clear;
List.Free;
end;
END;
end;
end;
end;
function MyPOS_SubStr(sSubStr, Sx : String; sSepSubStr : String=';'; YesUpcase : boolean = true) : integer;
//POS для ПодСтрок "по-группно"
//sSubStr - перечень групп символов, разделенных символом sSepSubStr
//Возвращается номер позиции в строке Sx (начиная с 1-цы), где найдена хотя бы одна группа из sSubStr
Var
c,i : integer;
sStr : String;
begin
Result:=0;
if (length(Sx)>0) and (length(sSubStr)>0) then begin
if YesUpcase then begin
sSubStr:=AnsiUpperCase(sSubStr);
Sx:=AnsiUpperCase(Sx);
end;
c:=Get_CountWords_In_String(sSubStr, sSepSubStr, false);
if c>0 then begin
i:=0;
while i<c do
begin
i:=i+1;
sStr:=Get_Word_From_String(sSubStr, i, sSepSubStr, false);
if length(sStr)>0 then begin
Result:=POS(sStr,Sx);
if Result>0 then begin
i:=c+1;
end;
end;
end;
end;
end;
end;
function Get_CountWords_In_String(Sx : String; UnChar: String=' '; YesAllTrim_Before: boolean=true) : integer;
//Определить кол-во слов в строке Sx. UnChar - множество разделителей
var
InWord : byte;
i : integer;
begin
Result:=0;
if YesAllTrim_Before then Sx:=trim(Sx);
if length(Sx)>0 then begin
InWord := 0;
i:=0;
while i<length(Sx) do
begin
i:=i+1;
if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
if InWord<=0 then Result:=Result+1; //переход на начало слова
InWord:=1; //Мы внутри слова
end
else begin //этот символ - разделитель
InWord:=0; //Мы снаружи слова
end;
end;
end;
end;
function Get_Word_From_String(Sx : String; NumWord : integer; UnChar: String=' '; YesAllTrim_Before: boolean=true) : String;
//Получить слово из строки Sx по номеру NumWord. UnChar - множество разделителей
//YesAllTrim_Before - если TRUE, то перед анализом удалить из строки левые и правые пробелы
Var
InWord : byte;
NumWordCur, i : integer;
begin
Result:='';
if YesAllTrim_Before then Sx:=trim(Sx);
if length(Sx)>0 then begin
if NumWord>0 then begin
InWord := 0;
NumWordCur:=0;
i:=0;
while i<length(Sx) do
begin
i:=i+1;
if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
if InWord<=0 then NumWordCur:=NumWordCur+1; //мы - на начале слова
InWord:=1; //Мы внутри слова
if NumWordCur=NumWord then begin //Это - наше слово
Result:=Result+Sx[i]; //и мы его выдираем из строки
end;
end
else begin //этот символ - разделитель
InWord:=0; //Мы снаружи слова
if NumWordCur=NumWord then begin //Это было - наше слово
i:=length(Sx)+1; //поэтому, выходим из цикла и функции
end;
end;
end;
end;
end;
end;
Последний раз редактировалось roamer, 28.07.2010 в 16:20.
|