Scala разбить строку на пробел, исключая определенные разделы - PullRequest
2 голосов
/ 08 апреля 2019

Я хочу разбить эту строку "158.106.201.22 '-' '-' [08 / Apr / 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 / Apr / 2019: 15: 19: 48 +0000]" и "GET /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")

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

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

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

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)
0 голосов
/ 08 апреля 2019

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

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...