如何在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组(双引号请求 - (“。+?”))正在创建问题。 任何帮助将受到高度赞赏......
答案 0 :(得分:2)
在我看来,您在Scala模式中引入了额外的space
+ "
。请注意,您不需要在三引号字符串文字中转义"
,因此无需将其放在字符类中,例如在["]
中。
您也可以将空间匹配模式放在捕获组之外以获得更清晰的组值,即使在空格丢失的情况下(\s*
匹配0个或更多个空格),您也可以使用\s*
进行匹配字符)。
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})"""
我改变了以下内容:
"
(".+?")