我有一个日志文件test_list.txt
,看起来像这样:
Processing SampleDocumentController#index (for 101.101.101.101 at 2020-12-12 12:00:00) [POST]
Session ID: sdfgs923jks0dm23mlasf3da9asfjvyur
Parameters: {"format"=>"xml", "controller"=>"sample_document", "q"=>"last_updated_at", "action"=>"index"}
Completed in 0.00529 (189 reqs/sec) | Rendering: 0.00007 (1%) | DB: 0.00126 (23%) | 200 OK [https://www.bars.com/sample/sample_document.lmx?]
我有一个正则表达式来捕获日志文件的方法和会话ID:
regex = /\[([A-Z]+)\]\D+([a-zA-Z0-9]{32}$)/i
当我单独运行它时,它可以正常工作并返回捕获的字符串"POST"
和"sdfgs923jks0dm23mlasf3da9asfjvyur"
。但是,使用以下脚本test.rb
:
File.open("test_list.txt").each do |li|
if !li.nil?
x = li.match(regex)
if !x.nil?
a, b = x.captures
p a
p b
end
end
end
在命令行中运行ruby test.rb
不会显示任何内容。
您知道为什么它不能与脚本一起使用吗?
答案 0 :(得分:3)
这是因为您的正则表达式仅在同时存在方法和会话ID时才匹配。在您的日志文件中,它们位于不同的行,并且这两行都不包含。因此,没有一行与正则表达式匹配。
答案 1 :(得分:1)
泽awa是正确的。我认为您误解了String#match
,您通常想在布尔上下文中使用它。
您可能想使用scan。您可以这样扫描它:
string = File.read("test_list.txt")
p string.scan(/(\[[A-Z]+\])|((?<=Session ID: )[a-zA-Z0-9]{33})/)
这将导致如下所示:
[["[POST]", nil], [nil, "sdfgs923jks0dm23mlasf3da9asfjvyur"]]
答案 2 :(得分:1)
这样做可以使它完全按照我的要求工作:
string = File.read("test_list.txt")
regex = /\[([A-Z]+)\]\D+([a-zA-Z0-9]{32}$)/
string.scan(regex).each do|x|
puts x
end
如果说,我只想打印一个特定的捕获组,我只需添加x的数组索引号:
puts x[0]
或
puts x[1]