Как создать регулярное выражение, которое удаляет символы, за которыми следует возврат
Я создаю веб-сервер, к которому люди подключаются, используя 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