2012-07-01 36 views
19

La siguiente es mi salida REPL. No estoy seguro de por qué string.split no funciona aquí.scala string.split no funciona

val s = "Pedro|groceries|apple|1.42" 
s: java.lang.String = Pedro|groceries|apple|1.42 

scala> s.split("|") 
res27: Array[java.lang.String] = Array("", P, e, d, r, o, |, g, r, o, c, e, r, i, e, s, |, a, p, p, l, e, |, 1, ., 4, 2) 

Respuesta

56

Si utiliza comillas, está pidiendo una división de expresión regular. | es el carácter "o", por lo que su expresión regular no coincide con nada ni nada. Entonces todo está dividido.

Si usa split('|') o split("""\|"""), debe obtener lo que desea.

+0

bueno uno. En scala, ¿cuál es la diferencia entre '' y ""? – riship89

+2

'" "" cosas "" "' cita una cadena literal. '" cosas "' interpreta los caracteres de escape. Como la barra invertida es un carácter de escape _both_ en Java cadenas _y_ expresiones regulares, necesitaría escapar del carácter de escape para obtenerlo en la expresión regular: '" \\ | "'. Esto se confunde _muy_ rápidamente, por lo que es mejor utilizar comillas triples y buscar una cadena literal. –

+0

y ... es 'somestring' lo mismo que "" "somestring" ""? – riship89

3

Split toma una expresión regular como primer argumento, por lo que su llamada se interpreta como "cadena vacía o cadena vacía". Para obtener el comportamiento esperado, debe escapar del carácter de tubería "\\ |".

5

| es un carácter especial expresión regular que se utiliza como un operador lógico para OR operaciones.

Desde java.lang.String#split(String regex); toma en una expresión regular, estás dividiendo la cadena con "ninguno o ninguno", que es un conjunto de otra especialidad sobre la división de expresiones regulares, donde ninguno significa esencialmente "entre cada personaje ".

Para obtener lo que desea, necesita escapar de su patrón de expresión regular correctamente. Para escapar del patrón, debe anteponer el carácter con \ y dado que \ es un carácter especial String (piense en \t y \r por ejemplo), necesita duplicar realmente para que termine con s.split("\\|").

Para ver la sintaxis completa de la expresión regular de Java, consulte java.util.regex.Pattern javadoc.

Cuestiones relacionadas