Регулярное выражение, совпадающее с многострочным шаблоном - PullRequest
0 голосов
/ 31 января 2019

У меня есть файл журнала 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?]

У меня есть регулярное выражение для захвата метода и идентификатора сеанса файла журнала:

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 в командной строке ничего не печатает.

Есть идеи, почему он не работает со сценарием?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Сава прав.Я думаю, вы неправильно поняли 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"]]

Вы можете поиграться с выражением на обычном

0 голосов
/ 01 февраля 2019

Я заставил его работать точно так, как я хотел, выполнив это:

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]
0 голосов
/ 31 января 2019

Это потому, что ваше регулярное выражение совпадает только тогда, когда присутствуют и метод, и идентификатор сеанса.В вашем лог-файле они расположены на разных строках, и ни одна из этих строк не включает оба.Следовательно, ни одна из строк не соответствует регулярному выражению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...