如何处理reged中的双引号 - Scala

时间:2017-09-11 11:11:03

标签: regex scala

如何在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组(双引号请求 - (“。+?”))正在创建问题。 任何帮助将受到高度赞赏......

2 个答案:

答案 0 :(得分:2)

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

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

查看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

答案 1 :(得分:0)

这似乎有效

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

我改变了以下内容:

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