首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Scala中的正则表达式从服务器日志字符串中提取路径

使用Scala中的正则表达式从服务器日志字符串中提取路径
EN

Stack Overflow用户
提问于 2019-07-11 18:38:59
回答 2查看 151关注 0票数 2

我有几根像下面这样的圆木

代码语言:javascript
复制
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

我需要从上面的日志中提取路径。这是我试过的代码

代码语言:javascript
复制
val pattern = "\\s+([^\\s]+)\\s+HTTP".r
val match = pattern.findFirstIn(log)

这是我得到的输出。

代码语言:javascript
复制
/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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-11 18:46:47

你的对手在第一组,

另外,您也可以使用正向前瞻。

代码语言:javascript
复制
\\s+[^\\s]+(?=\\s+HTTP)

演示

票数 2
EN

Stack Overflow用户

发布于 2019-07-11 18:48:35

您的匹配位于第一个捕获组()中,您可以将其缩短为:

代码语言:javascript
复制
\s(\S+)\s+HTTP 

在斯卡拉

代码语言:javascript
复制
val pattern = "\\s(\\S+)\\s+HTTP".r

Regex演示

您可以使用findAllIn获得日志:

代码语言:javascript
复制
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)
}

结果

代码语言:javascript
复制
/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演示

若要与注释中的该行匹配,请执行以下操作:

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

你可以使用:

代码语言:javascript
复制
\S+ (/(?:[^/\s]+/)*[^\s"]+)

Regex演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56995462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档