[英]Regex matching a multi-line pattern
我有一個日志文件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
不會顯示任何內容。
知道為什么它不能與腳本一起使用嗎?
這是因為僅當方法和會話ID同時存在時,您的正則表達式才匹配。 在您的日志文件中,它們位於不同的行,並且這兩行都不包含。 因此,沒有一行匹配正則表達式。
通過執行以下操作,我可以使其完全按照我的要求工作:
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.