假设我有一个日志文件,已经分割成字符串数组。例如,我有以下这些行。
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+) - "(.?)" "(.?)" 当我尝试使用它时,没有匹配项。
我希望将解析的行分解为其各个部分。
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
,操作系统
,操作系统版本
,浏览器
,浏览器版本
等。 对数据进行任何真正的解析都足够了。