簡體   English   中英

正則表達式匹配多行模式

[英]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同時存在時,您的正則表達式才匹配。 在您的日志文件中,它們位於不同的行,並且這兩行都不包含。 因此,沒有一行匹配正則表達式。

澤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"]]

您可以定期玩這個表情

通過執行以下操作,我可以使其完全按照我的要求工作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM