2016-04-28 32 views
5

Esiste una funzione in Octave che restituisce la posizione della prima occorrenza di una stringa in un array di celle?Octave: restituisce la posizione della prima occorrenza di una stringa in un array di celle

Ho trovato findstr ma questo restituisce un vettore, che non desidero. Voglio che cosa fa lo index ma funziona solo per le stringhe.

Se non esiste tale funzione, ci sono suggerimenti su come procedere?

+0

Vuoi la prima occorrenza in ogni cella o per l'intero array di celle? – excaza

+0

Riaperto dal duplicato perché questa domanda chiede di trovare la ** prima occorrenza ** della stringa, non ** tutte le occorrenze **. La risposta accettata gestisce anche la sfumatura di non essere in grado di trovare la stringa. Questa domanda ha una differenza fondamentale che porta a una soluzione diversa. – rayryeng

risposta

5

Poiché findstr è obsoleto, una combinazione di find e strcmpi potrebbe rivelarsi utile. strcmpi confronta le stringhe ignorando il caso delle lettere che potrebbero essere utili per i tuoi scopi. Se questo non è quello che vuoi, usa la funzione senza il trailing i, quindi strcmp. L'ingresso in strcmpi o strcmp sono la stringa per la ricerca di str e per il vostro caso il parametro di ingresso aggiuntivo è un array di celle A di stringhe per la ricerca. L'uscita del strcmpi o strcmp vi darà un vettore di logical valori in cui ogni posizione k indica se la stringa k nell'array di celle A corrisponde a str. Dovresti quindi utilizzare find per trovare tutte le posizioni di dove la stringa corrisponde, ma puoi ulteriormente trattenerlo specificando il numero massimo di posizioni n e dove vincolare la ricerca, in particolare se vuoi guardare il primo o l'ultimo n posizioni in cui la stringa corrisponde.

Se la stringa desiderata è in str e propria matrice cellulare è memorizzato in A, fare semplicemente:

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

per ribadire, find troverete tutti i luoghi in cui la stringa corrispondente, mentre il secondo e il terzo parametro raccontano si deve solo restituire il primo indice del risultato. Specificamente, questo restituirà la prima occorrenza della stringa cercata desiderata, o la matrice vuota se non può essere trovata.

Esempio 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

Vale la pena notare che 'strcmp' /' strcmpi' confronta solo * full * stringhe, quindi se stai cercando la sottostringa esistente probabilmente dovrai usare un'espressione regolare. – excaza

+0

@excaza Buon commento. Ho pensato che l'OP volesse cercare la stringa completa. Il linguaggio suggerisce così, ma le mie ipotesi mi hanno morso in @ $$ prima. – rayryeng

+1

@rayryeng Questo è perfetto! Grazie. E tu hai l'ipotesi giusta, volevo cercare la stringa completa. – CH123