如何构造一个正则表达式,删除后退后的字符

时间:2015-06-05 21:16:29

标签: ruby regex control-characters

我正在创建一个人们使用telnet连接到的网络服务器。 一些telnet客户端每行发送数据,但其他人在输入后立即发送每个字符。在服务器中,我会缓存这些内容,直到输入换行符。 (因此我们有一整行)

但是,退格字符(\x08)也会在字符串中发送。我想通过替换一个字符后跟一个没有空格的退格来实现退格行为。

但是,如果用户一次使用退格键删除多个字母,该怎么办?

是否有可能构建一个regexp,当后面跟着N个退格时,它会删除N个字符?

为了完整起见,我使用的是Ruby 2.2。

感谢。

1 个答案:

答案 0 :(得分: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')部分仅用于演示,以显示没有退格符号。请参阅IDEONE demo

另一种方法是

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

请参阅IDEONE demo,将\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