【问题标题】:How to process double quotes in reged -- Scala如何处理reged中的双引号——Scala
【发布时间】:2017-09-11 11:11:03
【问题描述】:

如何在 Scala 中为双引号应用正则表达式? 我的实际字符串是(tomcat 日志文件)

174.371.196.220 - - [07/Sep/2017:00:06:00 +0000] "GET /cs/v1/points/bal?memberId=2164699082&accountType=10 HTTP/1.1" 200

我的正则表达式模式是

(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(\\D{1,6})(\\[.+?\\])( \".+?\")( \\d{1,3}) 

找出IP、时间、请求和状态码。此代码在 java 中正常工作,但是当我尝试在第 3 组 ((\".+?\")) 的 scala 中应用相同的正则表达式时,它无法找到匹配项。我猜双引号在scala表示中会有所不同。任何人都可以帮助我解决这个问题......

在 scala 中我使用这样的模式

val pattern = """(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(\D{1,6})(\[.+?\])( ["])( ".+?")( \d{1,3})""".r

主要是第 3 组(双引号请求 -( ".+?") )造成了问题。 任何帮助将不胜感激......

【问题讨论】:

  • 删除( ["]),看起来是唯一的区别。
  • 请参阅下面的完整答案以及示例用法。

标签: regex scala


【解决方案1】:

在我看来,您在 Scala 模式中引入了一个额外的 space+"。请注意,您无需在三引号字符串文字中转义 ",因此无需将其放入字符类中,例如在 ["] 中。

您还可以将空格匹配模式放在捕获组之外以获得更清晰的组值,并且即使在缺少空格的情况下也可以使用\s* 进行匹配(\s* 匹配 0 个或多个空格字符)。

查看working Scala demo

val pattern = """(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(\D{1,6})(\[.+?\])\s*(".+?")\s*(\d{1,3})""".r;
val input = """174.371.196.220 - - [07/Sep/2017:00:06:00 +0000] "GET /cs/v1/points/bal?memberId=2164699082&accountType=10 HTTP/1.1" 200""";
val res = input match {
    case pattern(ip, typ, time, request, status) => s"IP=$ip\nTime=$time\nRequest=$request\nStatus=$status"
    case _ => "NONE"
}
print(res)

输出:

IP=174.371.196.220
Time=[07/Sep/2017:00:06:00 +0000]
Request="GET /cs/v1/points/bal?memberId=2164699082&accountType=10 HTTP/1.1"
Status=200

【讨论】:

    【解决方案2】:

    这似乎有效

    """(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(\D{1,6})(\[.+?\]) (".+?") (\d{1,3})"""
    

    我更改了以下内容:

    1. 删除了 ["],因为您已经在 (".+?") 中查找了起始 "
    2. 一个空格太多 - 我删除了
    3. 我没有在捕获组中包含空格

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多