2013-05-27 7 views
5

Sto provando a dividere un gruppo di testo con il separatore di barre |. 123.123.123.123|000.000.000.000 a ciascun blocco di indirizzi ip. Ma ogni numero non è diviso per |.Dividere le stringhe con il separatore diviso in ogni carattere in Scala

scala> "123.123.123.123|000.000.000.000".split("|") 
res30: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, |, 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0) 

scala> "123.123.123.123".split("|") 
res33: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3) 

così ho messo il separatore come Char e si vede quello che volevo.

scala> "123.123.123.123|000.000.000.000".split('|') 
res31: Array[String] = Array(123.123.123.123, 000.000.000.000) 

scala> "123.123.123.123".split('|') 
res32: Array[String] = Array(123.123.123.123) 

Perché il singolo carattere fa un'enorme differenza?

Ho letto Scala doc e StringLike.scala e non ho ricevuto risposta.

def split(separators: Array[Char]): Array[String] 
def split(separator: Char): Array[String] 

Grazie.

+0

Secondo la [documentazione] (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.StringOps), 'split' prende un Char come argomento. – squiguy

+2

@squiguy non solo Char: può tornare a [java's split, che prende String] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split (java. lang.String)) [regex] –

+0

@ om-nom-nom Sure, in tal caso '|' è speciale che è ovviamente quello che hai detto nella tua risposta. – squiguy

risposta

11

Il metodo split accetta sia string o carattere (i). Se usi la stringa, questa verrà interpretata come espressione regolare e "|" viene trattato come regex 'o' - nel tuo caso si riporta a 'ogni personaggio va nel proprio bin'. Fuga ad avere delimeter grezzo:

"123.123.123.123|000.000.000.000".split("\\|") 
res1: Array[String] = Array(123.123.123.123, 000.000.000.000) 

separatore di carattere viene interpretato come è, così hai il risultato desiderato senza tante storie

+0

Grazie @ om-nom-nom! Ho dimenticato di ricordare che molti dei metodi di Scala sono in realtà delle classi java.lang e java. Sarò con javadoc alla prossima volta. – eces

2

Si noti che, come om-nom-nom correttamente citato (ma non l'hai fatto fornire l'esempio), i personaggi (che sono racchiusi in un'unica ') sono validi anche:

"123.123.123.123|000.000.000.000".split('|') 

trovo che questo sia più evidente/leggibile. Suppongo anche che questo sarebbe più veloce, dal momento che non deve richiamare il parser regex. Ma questo è speculazione, naturalmente, e anche micro-ottimizzazione non necessaria.

+0

Dovrebbe essere considerevolmente più veloce di regexing - non ci sono dubbi. In realtà regexing, in quello scenario sarebbe semplicemente un errore. Ma la domanda non è su questo, e ciò che suggerisci è in realtà già scoperto nella domanda. –

+0

Sì, ho detto che l'om-nom-nom l'aveva già menzionato. Volevo solo fornire un esempio reale, poiché so che molte persone (incluso me stesso) spesso sfiorano solo una risposta per un pezzo di codice, che spesso è la soluzione. Dal momento che considero l'esempio di codice om-nom-nom postato non ottimale, ho postato il mio :) – fresskoma

+1

@ x3ro bene, non l'ho scritto perché op l'ha fatto nei suoi esempi (res31) ;-) Ma sono d'accordo che è probabile che sia più veloce della versione a stringa –

Problemi correlati