Извлеките путь из строки журнала сервера, используя регулярные выражения в Scala - PullRequest
2 голосов
/ 11 июля 2019

У меня есть несколько журналов, как показано ниже

endeavor.fujitsu.co.jp - - [10/Jul/1995:00:00:15 -0400] "GET /images/ HTTP/1.0" 200 17688                                   
ad13-022.compuserve.com - - [10/Jul/1995:00:00:15 -0400] "GET /history/gemini/gemini-spacecraft.txt HTTP/1.0" 200 651       
pm2-15.magicnet.net - - [10/Jul/1995:00:00:15 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713                        
204.239.199.40 - - [10/Jul/1995:00:00:16 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0613.gif HTTP/1.0" 200 45970  
pm1-4.tricon.net - - [10/Jul/1995:00:00:17 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669                        
scorpio.digex.net - - [10/Jul/1995:00:00:19 -0400] "GET /history/mercury/mr-3/mr-3.html HTTP/1.0" 200 1124

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

val pattern = "\\s+([^\\s]+)\\s+HTTP".r
val match = pattern.findFirstIn(log)

Вот вывод, который я получил.

/images/ HTTP
/history/gemini/gemini-spacecraft.txt HTTP
/images/launch-logo.gif HTTP
/shuttle/missions/sts-71/images/KSC-95EC-0613.gif HTTP
/images/WORLD-logosmall.gif HTTP
/history/mercury/mr-3/mr-3.html HTTP

Как мне избавиться от HTTP по указанным выше путям?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Ваш матч в первой группе захвата,

В качестве альтернативы вы можете использовать позитивный взгляд

\\s+[^\\s]+(?=\\s+HTTP)

Демо

enter image description here

0 голосов
/ 11 июля 2019

Ваш матч находится в первой группе захвата (), которую вы можете сократить до:

\s(\S+)\s+HTTP 

В Scala

val pattern = "\\s(\\S+)\\s+HTTP".r

Regex demo

Вы можете получить журналы, используя findAllIn:

val pattern = "\\s(\\S+)\\s+HTTP".r
val strings = List(
  """endeavor.fujitsu.co.jp - - [10/Jul/1995:00:00:15 -0400] "GET /images/ HTTP/1.0" 200 17688                                   """,
  """ad13-022.compuserve.com - - [10/Jul/1995:00:00:15 -0400] "GET /history/gemini/gemini-spacecraft.txt HTTP/1.0" 200 651       """,
  """pm2-15.magicnet.net - - [10/Jul/1995:00:00:15 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713                        """,
  """204.239.199.40 - - [10/Jul/1995:00:00:16 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0613.gif HTTP/1.0" 200 45970  """,
  """pm1-4.tricon.net - - [10/Jul/1995:00:00:17 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669                        """,
  """scorpio.digex.net - - [10/Jul/1995:00:00:19 -0400] "GET /history/mercury/mr-3/mr-3.html HTTP/1.0" 200 1124"""
)

strings.foreach { log =>
  val m = pattern.findAllIn(log).group(1)
  println(m)
}

Результат

/images/
/history/gemini/gemini-spacecraft.txt
/images/launch-logo.gif
/shuttle/missions/sts-71/images/KSC-95EC-0613.gif
/images/WORLD-logosmall.gif
/history/mercury/mr-3/mr-3.html

Scala demo

Для соответствия этой строкеиз комментария:

columbia.acc.brad.ac.uk - - [10 / Jul / 1995: 00: 52: 36 -0400] "GET /ksc.html" 200 7067

Вы можете использовать:

\S+ (/(?:[^/\s]+/)*[^\s"]+)

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...