2012-04-12 12 views
49

Ho due stringhe in scala e voglio scoprirlo, se la stringa più grande (needle) contiene una stringa più piccola (haystack).Qual è il modo di trovare la scala idiomatica, se una determinata stringa contiene una sottostringa data?

Quello che ho trovato lo sta facendo con espressioni regolari e partite come questo (from this question):

needle.r.pattern.matcher(haystack).matches

che è (1) grossolanamente troppo complicata per un semplice problema così, ma ancora più importante, (2) doesn 't lavoro per me, perché

"needle".r.pattern.matcher("Finding needle in haystack").matches

rendimenti

Boolean = false

+7

sto forse manca qualcosa, ma cosa c'è che non va con contiene? – JaimeJorge

+0

Stavo per chiedere la stessa cosa – covertCoder

+3

Non c'è niente di sbagliato, non l'ho trovato :) tutto qui. –

risposta

88

Se si vuole farlo con la massima efficienza, potrebbe essere necessario scrivere voi stessi (o trovare una buona stringa algoritmo di ricerca da qualche parte). Se si desidera solo farlo funzionare a tutti, allora in Scala:

scala> "Finding needle in haystack" contains "needle" 
res0: Boolean = true 

scala> "Finding needle in haystack" indexOf "needle" 
res1: Int = 8 

Questi sono non ricerche regex. Sia che tu non stia usando correttamente la regex match (edit: perché quel codice richiede una corrispondenza esatta all'intera stringa, non per trovare una sottostringa corrispondente), ma questo è un problema diverso. Se si desidera un conteggio del numero di partite, si può fare qualcosa di simile

scala> "needle".r.findAllIn("Finding needle in haystack").length 
res2: Int = 1 
+7

Se qualcuno si sta chiedendo, 'contains' e' indexOf' sono solo metodi su 'java.lang.String' e non vi è alcuna magia di Scala in corso qui. Non ho guardato la fonte, ma mi aspetto che siano metodi ottimizzati. –

+0

E cosa c'è di così lento o non ottimizzato? – matanster

13

Anche risposto ho pensato di offrire anche questo stile regex

scala> "I have a needle in my haystack" matches ".*needle.*" 
res10: Boolean = true 
+1

Questo è lento e funziona solo se non ci sono terminatori di riga. –

+0

lento rispetto a cosa? –

+1

Rispetto all'altra risposta. indexOf() (which uses() uses) è ben ottimizzato sia a livello Java che all'interno di JVM. –

Problemi correlati