Estoy dividiendo una cadena basada en una tubería |
personaje en scala. Veo dos opciones diferentes para hacer esto. Me sorprende ver que obtuve dos resultados diferentes en diferentes escenarios.
Mira esto:
En el caso de la cadena, también devolvió el carácter de canalización, mientras que en el caso de la cadena devolvió los resultados como se esperaba.
Tengo curiosidad por saber la diferencia entre ambos.
Respuestas
4 para la respuesta № 1La cosa es cuando estás proporcionando un String
este parámetro String
Puede ser una expresión regular. Y |
Es un personaje especial en el mundo de las expresiones regulares.
Esto será más claro para usted después del siguiente ejemplo,
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("|")
res7: Array[String] = Array(a, b, c, d, e, f)
Si quieres obtener el resultado deseado tendrás que escapar. |
utilizando \
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("\|")
res7: Array[String] = Array(abcdef)
2 para la respuesta № 2
En caso de cuerda necesita escapar. utilizar "\|"
en lugar de "|"
scala> "a|b|c|d".split("|")
res19: Array[String] = Array(a, |, b, |, c, |, d)
scala> "a|b|c|d".split("\|")
res20: Array[String] = Array(a, b, c, d)
scala> "a|b|c|d".split("|")
res21: Array[String] = Array(a, b, c, d)
scala> "a|b|c|d".split("""|""")
res23: Array[String] = Array(a, b, c, d)
1 para la respuesta № 3
Algunas formas más de escapar de una expresión regular:
scala> "a|b|c|d".split(raw"|")
res114: Array[String] = Array(a, b, c, d)
scala> "a|b|c|d".split(raw"Q|")
res115: Array[String] = Array(a, b, c, d)
scala> "a|b|c|d".split("""Q|""")
res116: Array[String] = Array(a, b, c, d)
scala> "a|b|c|d".split("\Q|")
res117: Array[String] = Array(a, b, c, d)
Tenga en cuenta que las variables se interpolan en raw
cuerdas, por lo que hay que tener cuidado con $
.
Q
es particularmente útil cuando tienes varios personajes para escapar y no quieres poner una barra invertida antes de cada uno de ellos.