2008-10-29 4 views

Odpowiedz

50

Można użyć AnsiIndexText (const AnsiString AText, const array of AValues ​​String): Integer lub MatchStr (const AText: string; const AValues: array of string): Boolean;

Coś

Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1); 

lub

Result := MatchStr('Hi', ['foo', 'Bar']); 

AnsiIndexText zwraca 0 offset indeks pierwszego ciąg stwierdzi w AValues ​​który pasuje AText rozróżniana wielkość liter. Jeśli ciąg określony przez AText nie ma dopasowania (w dużym stopniu bez rozróżniania wielkości liter) w AValues, AnsiIndexText zwraca -1. Porównania są oparte na bieżącym locale systemu .

MatchStr określa, czy którykolwiek z strun w AValues ​​tablicy dopasować ciąg określony przez AText używając case wrażliwą porównania. Zwraca true , jeśli co najmniej jeden z ciągów w macierzy jest zgodny lub fałsz, jeśli żaden z ciągów nie pasuje.

Uwaga AnsiIndexText ma rozróżniana wielkość liter i MatchStr jest wielkość liter, więc myślę, że to zależy od zastosowania

EDIT: 03/09/2011: Wystarczy znaleźć tę odpowiedź i że chciałbym dodać notatkę że w Delphi 2010 istnieje również funkcja MatchText, która jest taka sama jak MatchStr, ale przypadek nie jest ważny.- Larry

+0

W rzeczywistości jest lepszy, po prostu trochę przeszukano w StrUtils.pas i znalazłem MatchStr, który zwraca wartość logiczną: Wynik: = MatchStr ("Hi" , ['foo', 'Bar']); Dodaj go do swojej odpowiedzi –

+0

MatchStr i MatchText są również dostępne w Delphi 2007. –

+0

jakikolwiek odpowiednik delphi 7? – CyprUS

1

Oto funkcja, która spełnia swoje zadanie:

function StringInArray(Value: string; Strings: array of string): Boolean; 
var I: Integer; 
begin 
    Result := False; 
    for I := Low(Strings) to High(Strings) do 
    Result := Result or (Value = Strings[I]); 
end; 

W rzeczywistości, nie porównać mystring z każdej struny w łańcuchach. Jak tylko znajdziesz jedną pasującą, możesz wyjść z pętli for.

+0

To działa, należy zaktualizować kod z Delphi jednym: funkcji StringInArray (value: String; ciągi: tablicę String): Boolean; var I: Integer; Rozpocznij Wynik: = Fałsz; dla I: = Niski (Ciągi) do Wysoki (Ciągi) do Wynik: = Wynik lub (Wartość = Łańcuchy [I]); koniec; –

+0

Trudno jest n00b i nie można edytować rzeczy :( –

7

Kod Burkharda działa, ale niepotrzebnie przechodzi przez listę, nawet jeśli znaleziono dopasowanie.

lepsze podejście:

function StringInArray(const Value: string; Strings: array of string): Boolean; 
var I: Integer; 
begin 
    Result := True; 
    for I := Low(Strings) to High(Strings) do 
    if Strings[i] = Value then Exit; 
    Result := False; 
end; 
-4

Można spróbować:

Result := Pos(MyString, string1+string2+string3+string4) > 0 
+3

Niestety, twoje rozwiązanie daje pozytywne wyniki dla podłańcuchów Jeśli nie, np. Pos ("ca", "cat" + "pies") daje 1, ale potrzebne jest 0. Pos ("td", "cat" + "pies") daje 3, ale 0 oznacza – lkessler

+1

-1 dla fałszywych alarmów –

+0

Gorsze rozwiązanie, ponieważ nie jest konieczne łączenie wszystkich łańcuchów.Najlepszym rozwiązaniem jest @ Re0sless powyżej. –

Powiązane problemy