如何构建一个删除字符后跟退格键的正则表达式
How to construct a regexp that removes characters followed by backspace
我正在创建一个人们使用 telnet
连接的网络服务器。
一些 telnet 客户端每行发送数据,但其他客户端在输入时立即发送每个字符。在服务器中,我缓存这些直到输入换行符。 (因此我们有一条完整的线)
但是,退格字符 (\x08
) 也会发送到字符串中。我想通过替换一个字符后跟一个退格键来实现退格行为。
但是,如果用户使用退格键一次删除多个字母怎么办?
是否可以构造一个正则表达式,在后跟 N 个退格键后删除 N 个字符?
为了完整起见,我使用 Ruby 2.2 .
谢谢。
您可以使用带有子程序调用的递归正则表达式来实现:
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
我正在创建一个人们使用 telnet
连接的网络服务器。
一些 telnet 客户端每行发送数据,但其他客户端在输入时立即发送每个字符。在服务器中,我缓存这些直到输入换行符。 (因此我们有一条完整的线)
但是,退格字符 (\x08
) 也会发送到字符串中。我想通过替换一个字符后跟一个退格键来实现退格行为。
但是,如果用户使用退格键一次删除多个字母怎么办?
是否可以构造一个正则表达式,在后跟 N 个退格键后删除 N 个字符?
为了完整起见,我使用 Ruby 2.2 .
谢谢。
您可以使用带有子程序调用的递归正则表达式来实现:
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