Метод разделения Scala StringLike создает дополнительные двойные кавычки для начальных пробелов

Я попробовал простое разделение для строки в стиле csv, которая содержит пробелы после запятых, например:

scala> """"First", "SecondAfterSpace"""".split(",")
res0: Array[String] = Array("First", " "SecondAfterSpace"")

scala> res0(0)
res3: String = "First"

scala> res0(1)
res4: String = " "SecondAfterSpace""

Вторая строка результирующего массива содержит непредвиденные двойные кавычки, больше, чем исходная строка.

Это нормально, что он содержит дополнительное пространство в начале, так как я еще не обрезал его. Но я бы ожидал такого же результата, как в следующем примере, с дополнительным начальным пробелом вместо дополнительных двойных кавычек:

scala> """"First","SecondNoSpace"""".split(",")
res1: Array[String] = Array("First", "SecondNoSpace")

Я знаю, что могу обойти эту проблему следующим образом, но я хотел бы понять, делаю ли я что-то не так или это ошибка:

scala> """"First", "SecondAfterSpaceTrimmed"""".split(",").map(_.trim)
res2: Array[String] = Array("First", "SecondAfterSpaceTrimmed")

Просто чтобы убедиться, что я также пробовал все варианты, такие как

.split(',')
.split(""",""")
.split("""\,""")
.split(Array(','))

но все с тем же результатом дополнительных двойных кавычек.

В этом контексте: Из scala-doc я вижу, что используется метод в StringLike. В документации говорится о массиве символов. Тем не менее, я могу использовать регулярное выражение, которое не задокументировано, поэтому у меня возникли подозрения, если он использует метод разделения в строке Java... Я запутался...


person fredfred    schedule 21.05.2013    source источник


Ответы (1)


Нет. Вот как это представляет REPL:

scala> val xs = """"First", "SecondAfterSpace"""".split(",")
xs: Array[String] = Array("First", " "SecondAfterSpace"")

scala> xs.last
res0: String = " "SecondAfterSpace""

scala> xs.last.count(_ == '"')
res1: Int = 2

Как видите, лишних кавычек нет.

Чтобы обрезать пробелы после кавычки, вы можете использовать регулярное выражение в разделении:

scala> val xs = """"First", "SecondAfterSpace"""".split(",[ ]?")
xs: Array[String] = Array("First", "SecondAfterSpace")
person om-nom-nom    schedule 21.05.2013
comment
Более общим регулярным выражением для разделения будет: """,\p{Space}*""" - person nadavwr; 22.05.2013
comment
Спасибо за быстрый ответ и регулярное выражение, игнорирующее пробел. Таким образом, разделение scala, похоже, использует регулярное выражение, несмотря на документ scala, в котором говорится о разделителях (символах) - там нет упоминания о регулярном выражении. - person fredfred; 22.05.2013
comment
@fredfred Строки Scala — это строки Java и Строки Java имеют метод разделения, который принимает регулярное выражение. StringLike прокачивает строку Java с помощью методов разделения, которые принимают разделители либо как один символ, либо как массив символов. - person om-nom-nom; 22.05.2013
comment
@ om-nom-nom, спасибо, это прекрасно решает мою путаницу! Простые сигнатуры методов выполняют маршрутизацию к любой реализации. - person fredfred; 22.05.2013