【发布时间】:2021-04-12 16:58:50
【问题描述】:
假设我有一个已拆分为字符串数组的日志文件。例如我这里有这些行。
123.4.5.1 - - [03/Sep/2013:18:38:48 -0600] "GET /products/car/ HTTP/1.1" 200 3327 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36"
123.4.5.6 - - [03/Sep/2013:18:38:58 -0600] "GET /jobs/ HTTP/1.1" 500 821 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:23.0) Gecko/20100101 Firefox/23.0"
我可以通过典型的字符串操作来解析这些,但是我认为使用正则表达式可以更好地做到这一点。我试图遵循某人在python 中使用过的类似模式,但我不太明白。这是我的尝试。
这是模式: ([(\d.)]+) - - [(.?)] "(.?)" (\d+) - "(. ?)" "(.?)" 当我尝试使用它时,我找不到匹配项。
let lines = contents.split(separator: "\n")
let pattern = "([(\\d\\.)]+) - - \\[(.*?)\\] \"(.*?)\" (\\d+) - \"(.*?)\" \"(.*?)\""
let regex = try! NSRegularExpression(pattern: pattern, options: [])
for line in lines {
let range = NSRange(location: 0, length: line.utf16.count)
let parsedData = regex.firstMatch(in: String(line), options: [], range: range)
print(parsedData)
}
如果我可以将数据提取到最好的模型中。我需要确保代码高效且快速,因为我可能需要考虑数千行代码。
预期结果
let someResult = (String, String, String, String, String, String) or
let someObject: LogFile = LogFile(String, String, String...)
我会寻找将解析后的行分解成各个部分。 IP, OS, OS Version, Browser Browser Version 等。任何真正的数据解析就足够了。
【问题讨论】:
-
对我来说这更像是一个 Apache 日志文件。
-
@MartinR 是的,这是我的错字。已更正。