Как создать регулярное выражение, которое удаляет символы, за которыми следует возврат

Я создаю веб-сервер, к которому люди подключаются, используя telnet, Некоторые telnet-клиенты отправляют данные построчно, но другие отправляют каждый символ сразу после его ввода. На сервере я их кеширую, пока не наберется новая строка. (И поэтому у нас есть полная строка)

Тем не менее, символы возврата, (\x08), также отправляются и в строке. Я хотел бы реализовать поведение Backspace, заменив символ с последующим Backspace ничем.

Тем не менее, что если пользователь использует backspace для удаления более одной буквы за раз?

Можно ли построить регулярное выражение, которое удаляет количество символов N, а затем количество возвратов N?

Для полноты картины я использую Ruby 2.2 .

Благодарю.

1 ответ

Решение

Вы можете достичь этого с помощью рекурсивного регулярного выражения с помощью вызова подпрограммы:

str = "\bNewqaz\b\b\b car!!!\b\b\b."
puts str.gsub(/^[\b]+|([^\b](\g<1>)*[\b])/, '').gsub(/[\b]/,'B')
# => New car.

Обратите внимание, что .gsub(/[\b]/,'B') part используется только для демонстрации, чтобы показать, что не осталось символов возврата. Смотрите демоверсию IDEONE.

Альтернативный подход

loop do 
  str = str.gsub(Regexp.new("^\b+|[^\b]\b"), "")
  break if !str.include?("\b")
end 

Смотрите демоверсию IDEONE, поворачивая \bNewqaz\b\b\b car!!!\b\b\b. в New car.:

str = "\bNewqaz\b\b\b car!!!\b\b\b."
puts str.gsub(/\x08/, "B")
loop do 
  str = str.gsub(Regexp.new("^\b+|[^\b]\b"), "")
  break if !str.include?("\b")
end 
puts str
Другие вопросы по тегам