Rozdzielam ciąg oparty na rurze |
postać w scala. Widzę dwie różne opcje, aby to zrobić. Jestem zaskoczony, widząc dwa różne wyniki w różnych scenariuszach.
Sprawdź to:
W przypadku ciągu zwracał również znak potoku, natomiast w przypadku znaku zwracał wyniki zgodnie z oczekiwaniami.
Ciekaw jestem, jaka jest różnica między nimi.
Odpowiedzi:
4 dla odpowiedzi № 1Chodzi o to, kiedy zapewniasz String
sparametryzuj to String
może być wyrażeniem regularnym. I |
jest specjalną postacią w świecie wyrażeń regularnych.
Stanie się to dla ciebie bardziej zrozumiałe po następującym przykładzie:
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("|")
res7: Array[String] = Array(a, b, c, d, e, f)
Jeśli chcesz uzyskać pożądany rezultat, musisz uciec |
za pomocą \
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("\|")
res7: Array[String] = Array(abcdef)
2 dla odpowiedzi nr 2
W przypadku sznurka wymaga ucieczki. posługiwać się "\|"
zamiast "|"
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 dla odpowiedzi nr 3
Kilka innych sposobów na uniknięcie wyrażenia regularnego:
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)
Zauważ, że zmienne są interpolowane w raw
struny, więc trzeba być ostrożnym $
.
Q
jest szczególnie przydatny, gdy masz kilka postaci do ucieczki i nie chcesz wstawiać ukośnika przed każdym z nich.