【问题标题】:How to construct a regexp that removes characters followed by backspace如何构造一个删除字符后跟退格的正则表达式
【发布时间】:2015-06-05 21:16:29
【问题描述】:

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

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

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

是否可以构造一个正则表达式,在后跟 N 个退格键时删除 N 个字符?

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

谢谢。

【问题讨论】:

    标签: ruby regex control-characters


    【解决方案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
    

    【讨论】:

    • 谢谢!这很有意义。另外,感谢 IDEONE 上的额外示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2023-02-22
    相关资源
    最近更新 更多