Я хочу разделить эту строку "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")
Как лучше всего это сделать? Спасибо!
Может быть, просто использовать регулярное выражение?
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)
split()
позволяет вам указать регулярное выражение, которое будет использоваться для разбиения, поэтому вы можете создать регулярное выражение, которое предотвратит разбиение слов, которые вы не хотите разбивать.