Je coupe une ficelle basée sur un tuyau |
personnage en scala. Je vois deux options différentes pour le faire. Je suis surpris de voir que j'ai obtenu deux résultats différents dans des scénarios différents.
Regarde ça:
Dans le cas d'une chaîne, il renvoyait également un caractère de canal tandis qu'en cas de caractère, il renvoyait les résultats comme prévu.
Je suis curieux de connaître la différence entre les deux.
Réponses:
4 pour la réponse № 1La chose est quand vous fournissez un String
paramétrer cette String
peut être une expression régulière. Et |
est un caractère spécial dans le monde des expressions régulières.
Cela deviendra plus clair pour vous après l'exemple suivant,
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("|")
res7: Array[String] = Array(a, b, c, d, e, f)
Si vous voulez obtenir le résultat souhaité, vous devrez vous échapper. |
en utilisant \
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("\|")
res7: Array[String] = Array(abcdef)
2 pour la réponse № 2
En cas de ficelle, il doit s'échapper. utilisation "\|"
au lieu 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 pour la réponse № 3
Quelques autres moyens d'échapper à une expression régulière:
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)
Notez que les variables sont interpolées dans raw
cordes, donc il faut faire attention avec $
.
Q
est particulièrement utile lorsque vous avez plusieurs personnages à échapper et que vous ne voulez pas mettre une barre oblique inverse avant chacun d’eux.