2016-04-28 6 views
5

Gibt es eine Funktion in Octave, die die Position des ersten Auftretens einer Zeichenkette in einem Zellenfeld zurückgibt?Oktave - gibt die Position des ersten Auftretens einer Zeichenkette in einem Zellenfeld zurück

Ich habe findstr gefunden, aber das gibt einen Vektor, den ich nicht will. Ich möchte, was index tut, aber es funktioniert nur für Strings.

Wenn es keine solche Funktion gibt, gibt es irgendwelche Tipps, wie es geht?

+0

Haben Sie das erste Vorkommen in jeder Zelle oder für das gesamte Zellenfeld wollen? – excaza

+0

Erneut aus dem Duplikat geöffnet, da bei dieser Frage das ** erste Vorkommen ** der Zeichenfolge gesucht wird, nicht ** alle Vorkommen **. Die akzeptierte Antwort behandelt auch die Nuance, die Zeichenfolge nicht finden zu können. Diese Frage hat einen grundlegenden Unterschied, der zu einer anderen Lösung führt. – rayryeng

Antwort

5

Da findstr veraltet ist, kann sich eine Kombination aus find und strcmpi als nützlich erweisen. strcmpi vergleicht Zeichenketten durch Ignorieren des Falls der Buchstaben, die für Ihre Zwecke nützlich sein können. Wenn dies nicht gewünscht ist, verwenden Sie die Funktion ohne das nachfolgende i, also strcmp. Der Eingang in strcmpi oder strcmp sind die Zeichenfolge für str und für Ihren Fall zu suchen, die zusätzlichen Eingabeparameter ist ein Zellenfeld A von Strings in suchen. Die Ausgabe von strcmpi oder strcmp geben Ihnen einen Vektor von logical Werten, wobei jeder Standort k teilt Ihnen mit, ob die Zeichenfolge k im Zellenfeld A mit str übereinstimmt. Sie würden dann find verwenden, um alle Positionen zu finden, an denen die Zeichenfolge übereinstimmte, aber Sie können sie weiter beschränken, indem Sie die maximale Anzahl der Speicherorte n angeben und wo Sie Ihre Suche einschränken können - speziell wenn Sie die erste oder letzte n betrachten möchten Orte, an denen die Zeichenfolge übereinstimmte.

Wenn die gewünschte Zeichenfolge in str ist und Ihr Zellenfeld in A gespeichert sind, einfach tun:

index = find(strcmpi(str, A)), 1, 'first'); 

Um es zu wiederholen, find alle Orte finden, wo die Schnur angepasst, während die zweite und dritte Parameter sagen Sie geben nur den ersten Index des Ergebnisses zurück. Insbesondere wird dadurch das erste Vorkommen der gewünschten gesuchten Zeichenfolge oder das leere Array zurückgegeben, wenn es nicht gefunden werden kann.

Beispiel Run

octave:8> A = {'hello', 'hello', 'how', 'how', 'are', 'you'}; 
octave:9> str = 'hello'; 
octave:10> index = find(strcmpi(str, A), 1, 'first') 
index = 1 
octave:11> str = 'goodbye'; 
octave:12> index = find(strcmpi(str, A), 1, 'first') 
index = [](1x0) 
+1

Beachten Sie, dass 'strcmp' /' strcmpi' nur * vollständige * Strings vergleicht. Wenn Sie also nach dem Existenz-Teilstring suchen, müssen Sie wahrscheinlich einen Regex verwenden. – excaza

+0

@excaza Guter Kommentar. Ich nahm an, dass der OP nach der vollständigen Zeichenfolge suchen wollte. Die Sprache suggeriert das, aber meine Annahmen haben mich schon im @ $$ gebissen. – rayryeng

+1

@rayryeng Das ist perfekt! Vielen Dank. Und deine Annahme war richtig, ich wollte nach der ganzen Zeichenfolge suchen. – CH123