Не жадные регулярные выражения в Ruby: pty и ожидаемо - PullRequest
1 голос
/ 27 марта 2012

Я проводил небольшой тест, чтобы попробовать pty Руби, и я не могу понять это правильно.Я думаю, что основная проблема заключается в том, что регулярное выражение не является жадным.

Эта программа называется inputs.rb:

puts "Give me root@server password:"
password = gets.chomp()
puts "Thank you! Your password is: #{password}"

И эта программа называется test.rb:

require 'pty'
require 'expect'

#$expect_verbose = true

#answer = %r/Thank you! Your password is: \w+/

PTY.spawn("ruby ./inputs.rb") do |reader, writer, pid|

   writer.sync = true

   reader.expect(/root@server password:/) do |output|
      writer.puts("password1234")
   end

   #reader.expect(answer) do |output|
   #reader.expect(/Thank you! Your password is: \w{6,}/) do |output|
   #reader.expect(/Thank you! Your password is: (\w+)/) do |output|
   reader.expect(/Thank you! Your password is: \w+/) do |output|
      puts "The whole output is ||||#{output}||||\n"
      output.first.each do |line|
         puts "output1 = |#{line}|\n"
      end
   end

end

К сожалению, при печати вывода я получаю это:
The whole output is ||||<br> password1234<br> Thank you! Your password is: p||||<br> output1 = |<br> |<br> output1 = |password1234<br> |<br> output1 = |Thank you! Your password is: p|

Почему это
Thank you! Your password is: p||||
вместо
Thank you! Your password is: password1234||||?

Это нормально?Если это так: есть ли способ изменить это поведение?

Вещи, которые я пробовал:

Версия Ruby: 1.8.7
Ubuntu: 10.04 (Lucid Lynx)

Буду признателен за любые ваши идеи.Большое спасибо.

1 Ответ

0 голосов
/ 27 марта 2012

Похоже, что возврат каретки вводит в заблуждение квантификатор "+".

Ниже приводится соответствие всей строке, включая возврат каретки (который портит форматирование вывода и должен быть обрезан)

   reader.expect(/Thank you! Your password is: \w+\r/) do |output|

Удачи.

...