Это работает для конкретных примеров, в том числе в комментариях OP.Как это часто бывает при использовании регулярного выражения для анализа, он становится мешаниной с дополнительными случаями и тестами для обработки постоянно растущих известных входных данных.Это обрабатывает списки номеров строк, используя цикл while с не жадным совпадением.Как написано, это просто обрабатывает ввод построчно.Чтобы получить ряд номеров строк через границы строк, его необходимо изменить, чтобы он обрабатывался как один кусок с соответствием между строками.
open( ARGV[0], "r" ) do |file|
while ( line = file.gets )
# replace both "line ddd" and "lines ddd" with line_ddd
line.gsub!( /(lines?\s)(\d+)/, 'line_\2' )
# Now replace the known sequences with a non-greedy match
while line.gsub!( /(line_\d+[a-z]?,?)(\sand\s|\sthrough\s|,\s)(\d+)/, '\1\2line_\3' )
end
puts line
end
end
Пример данных : Для этого ввода:
Subtract line 4 from line 1.
Enter the amount from line 5
on lines 4 and 8 the same?
Skip lines 9 through 12; go to line 13.
... on line 10 Form 1040A, lines 7, 8a, 9a, 10, 11b, 12b, and 13
Add lines 2, 3, and 4
Это выдаёт:
Subtract line_4 from line_1.
Enter the amount from line_5
on line_4 and line_8 the same?
Skip line_9 through line_12; go to line_13.
... on line_10 Form 1040A, line_7, line_8a, line_9a, line_10, line_11b, line_12b, and line_13
Add line_2, line_3, and line_4