Sto dividendo una stringa basata su una pipe |
personaggio in scala. Vedo due diverse opzioni per farlo. Sono sorpreso di vedere che ho ottenuto due risultati diversi in diversi scenari.
Controllalo:
In caso di stringa, ha anche restituito il carattere pipe mentre in caso di carattere ha restituito i risultati come previsto.
Sono curioso di sapere la differenza in entrambi.
risposte:
4 per risposta № 1Il fatto è quando stai fornendo un String
Parametri questo String
può essere un'espressione regolare. E |
è un personaggio speciale nel mondo delle espressioni regolari.
Questo ti diventerà più chiaro dopo aver seguito l'esempio,
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("|")
res7: Array[String] = Array(a, b, c, d, e, f)
Se vuoi ottenere il risultato desiderato dovrai fuggire |
utilizzando \
scala> val s1 = "abcdef"
s1: String = abcdef
scala> s1.split("\|")
res7: Array[String] = Array(abcdef)
2 per risposta № 2
In caso di stringa, è necessario eseguire l'escape. uso "\|"
invece di "|"
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 per risposta № 3
Alcuni altri modi di sfuggire a un'espressione regolare:
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)
Si noti che le variabili sono interpolate in raw
stringhe, quindi bisogna stare attenti $
.
Q
è particolarmente utile quando hai diversi personaggi da sfuggire e non vuoi mettere una barra rovesciata prima di ognuno di essi.