Разделенная строка Scala на пробелах, исключая определенные разделы

Я хочу разделить эту строку "158.106.201.22 '-' '-' [08/апр/2019:15:19:48 +0000] 'GET /media/2tSodgDfwCjIMCBY8h/200w_d.gif HTTP/1.1' 200 3293" на семь отдельных токенов. так что я получаю список вроде:

List("158.106.201.22", "-", "-", "08/Apr/2019:15:19:48 +0000]", "GET /media/2tSodgDfwCjIMCBY8h/200w_d.gif HTTP/1.1", "200", "3293"). 

Я пытался использовать метод Scala split(), используя пустое пространство в качестве разделителя, но в итоге я разделил "[08/апр/2019:15:19:48 +0000]" и «ПОЛУЧИТЬ /media/2tSodgDfwCjIMCBY8h/200w_d.gif HTTP/1.1» в отдельные токены, поскольку они также включают пустое пространство, поэтому я получаю что-то вроде:

List("158.106.201.22", "-", "-", "[08/Apr/2019:15:19:48", "+0000]", "GET", "/media/2tSodgDfwCjIMCBY8h/200w_d.gif", "HTTP/1.1", "200", "3293")

Как лучше всего это сделать? Спасибо!

split() позволяет вам указать регулярное выражение, которое будет использоваться для разбиения, поэтому вы можете создать регулярное выражение, которое предотвратит разбиение слов, которые вы не хотите разбивать.
Dominik Wosiński 08.04.2019 20:33
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
2
1
177
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Может быть, просто использовать регулярное выражение?

val str = "158.106.201.22 '-' '-' [08/Apr/2019:15:19:48 +0000] 'GET /media/2tSodgDfwCjIMCBY8h/200w_d.gif HTTP/1.1' 200 3293" 

val pattern = "([\\d\\.]+) ('-') ('-') (\\[.+\\]) ('.*') (\\d+) (\\d+)".r

val values = pattern.findAllIn(str) match {
   case matched => (1 to matched.groupCount).map(matched.group).toArray
}

values //Array("158.106.201.22", "'-'", "'-'", "[08/Apr/2019:15:19:48 +0000]", "'GET /media/2tSodgDfwCjIMCBY8h/200w_d.gif HTTP/1.1'", "200", "3293")
Ответ принят как подходящий

Если вам не нравится сложное регулярное выражение:

val str = "158.106.201.22 '-' '-' [08/Apr/2019:15:19:48 +0000] 'GET /media/2tSodgDfwCjIMCBY8h/200w_d.gif HTTP/1.1' 200 3293"

val stage1 =  str.split("[\\[\\]\\']")
                  .map(_.trim)
                  .filterNot(_.isEmpty)

val result = stage1.dropRight(1) ++ stage1.last.split(" ")

println(result.toList)

//List(158.106.201.22, -, -, 08/Apr/2019:15:19:48 +0000, GET /media/2tSodgDfwCjIMCBY8h/200w_d.gif HTTP/1.1, 200, 3293)

Другие вопросы по теме