2013-06-03 16 views
6

Mam problem z pewnym kodem Scala, gdzie znalazłem tę linię podziału. Zanim użyłem tylko linii podziału, takich jak:Co oznacza ta linia podziału w Scali?

var newLine = line.split(",") 

Ale co oznacza ten podział?

var newLine2 = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)") 

Linia muszę podzielić wygląda następująco:

1966, "Green, Green Grass of Home", Tom Jones, 850000 

Dzięki z góry!

+1

Oprócz składni deklaracji 'val name = expression', nie jest to rzecz typu Scala. Metoda "split" jest zdefiniowana na 'java.lang.String': http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String) –

Odpowiedz

11

Ciąg wewnątrz metody podziału definiuje regular expression. Grupa (?=([^\"]*\"[^\"]*\")*[^\"]*$) to positive lookahead assertion. Oznacza to podział na przecinek, ale tylko wtedy, gdy wzorzec ([^\"]*\"[^\"]*\")*[^\"]*$ podąża za przecinkiem.

([^\"]*  # a series of non double quote characters 
    \"  # a double quote 
    [^\"]* # a series of non double quote characters 
\")   # a double quote 
*   # repeat that whole group 0 or more times 
[^\"]*$  # a series of non double quote characters till the end of the string 

oznacza, że ​​będzie ona podzielona tylko na przecinki, gdy nie jest równa ilości cudzysłów po przecinku, więc innymi słowy, tylko rozłam jeśli przecinek nie jest wewnątrz cudzysłowach. (To zadziała tak długo, jak długo w tekście występują tylko pary cudzysłowów).

+0

dzięki za szybką i pomocną odpowiedź! :) teraz to ma sens. – amko23