2012-04-12 16 views
49

Tengo dos cadenas en scala y quiero averiguar si la cadena más grande (needle) contiene una cadena más pequeña (haystack).¿Cuál es la forma de búsqueda scala idiomática, si una cadena dada contiene una subcadena dada?

Lo que encontré lo está haciendo con las expresiones regulares y Partidos como éste (from this question):

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

que es (1) groseramente demasiado complicado para un problema tan sencillo, pero lo más importante, (2) doesn 't funciona para mí, porque

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

vuelve

Boolean = false

+7

estoy quizá falta algo, pero ¿Qué hay de malo con contiene? – JaimeJorge

+0

Estaba a punto de preguntar lo mismo – covertCoder

+3

No tiene nada de malo, simplemente no lo he encontrado :) eso es todo. –

Respuesta

88

Si desea hacerlo con la máxima eficacia, puede que tenga que escribirlo usted mismo (o encontrar un buen algoritmo de búsqueda de subcadenas en alguna parte). Si lo que desea que funcione en absoluto, entonces en Scala:

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

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

Estos son no búsquedas de expresiones regulares. Tampoco está usando correctamente la corrección de expresiones regulares (editar: porque ese código pide una coincidencia exacta con toda la cadena, no para encontrar una subcadena que coincida), pero ese es un problema diferente. Si quieres un recuento del número de coincidencias, se puede hacer algo como

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

Si alguien se pregunta, 'contains' y' indexOf' son solo métodos en 'java.lang.String' y aquí no hay magia Scala. No he visto la fuente, pero espero que sean métodos bien optimizados. –

+0

¿Y qué es tan lento o no optimizado sobre ellos? – matanster

13

Aunque respondido pensé que también iba a ofrecer este estilo de expresiones regulares

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

Esto es lento, y solo funciona si no hay terminadores de línea. –

+0

lento en comparación con qué? –

+1

En comparación con la otra respuesta. indexOf() (que contiene() usa) está bien optimizado tanto a nivel de Java como dentro de la JVM. –

Cuestiones relacionadas