代码之家  ›  专栏  ›  技术社区  ›  Jeremy Mullin

如何使用Ruby删除回车符?

  •  68
  • Jeremy Mullin  · 技术社区  · 16 年前

    我原以为这段代码可以工作,但正则表达式与\r\n不匹配。我在十六进制编辑器中查看了我正在读取的数据,并验证了文件中确实存在十六进制D和十六进制a模式。

    这是我现在的代码:

       lines2 = lines.gsub( /\r\n/m, "\n" )
       if ( lines == lines2 )
           print "still the same\n"
       else
           print "made the change\n"
       end
    

    14 回复  |  直到 16 年前
        1
  •  176
  •   Ian Vaughan    10 年前

    String#strip

    返回删除前导和尾随空格的str副本。

    "    hello    ".strip   #=> "hello"   
    "\tgoodbye\r\n".strip   #=> "goodbye"
    

    使用gsub

    string = string.gsub(/\r/," ")
    string = string.gsub(/\n/," ")
    
        2
  •  36
  •   localshred    16 年前

    通常,当我处理剥离\r或\n时,我会通过执行以下操作来查找两者:

    lines.gsub(/\r\n?/, "\n");
    

    我发现,根据数据的保存方式(使用的操作系统、使用的编辑器、当时木星与Io的关系),在回车后可能有或可能没有换行符。在十六进制模式下看到这两个角色确实很奇怪。希望这有帮助。

        3
  •  27
  •   neck    8 年前

    squish 方法

    "\tgoodbye\r\n".squish => "goodbye"

    "\tgood \t\r\nbye\r\n".squish => "good bye"

        4
  •  23
  •   Rômulo Ceccon    16 年前

    当你这样做的时候,你得到了什么 puts lines

    默认情况下 File.open 以文本模式打开文件,以便 \r\n 字符将自动转换为 \n . 也许这就是原因 lines 总是等于 lines2 . 要防止Ruby解析行结尾,请使用 rb 模式:

    C:\> copy con lala.txt
    a
    file
    with
    many
    lines
    ^Z
    
    C:\> irb
    irb(main):001:0> text = File.open('lala.txt').read
    => "a\nfile\nwith\nmany\nlines\n"
    irb(main):002:0> bin = File.open('lala.txt', 'rb').read
    => "a\r\nfile\r\nwith\r\nmany\r\nlines\r\n"
    irb(main):003:0>
    

    File.read .

        5
  •  17
  •   Vik    12 年前
    modified_string = string.gsub(/\s+/, ' ').strip
    
        6
  •  15
  •   Cameron Price    16 年前
    lines2 = lines.split.join("\n")
    
        7
  •  14
  •   Joel AZEMAR    13 年前

    "still the same\n".chomp

    "still the same\n".chomp!

    http://www.ruby-doc.org/core-1.9.3/String.html#method-i-chomp

        8
  •  6
  •   mwilliams    16 年前

    irb(main):003:0> my_string = "Some text with a carriage return \r"
    => "Some text with a carriage return \r"
    irb(main):004:0> my_string.gsub(/\r/,"")
    => "Some text with a carriage return "
    irb(main):005:0>
    

    irb(main):007:0> my_string = "Some text with a carriage return \r\n"
    => "Some text with a carriage return \r\n"
    irb(main):008:0> my_string.gsub(/\r\n/,"\n")
    => "Some text with a carriage return \n"
    irb(main):009:0>
    
        9
  •  5
  •   Nathan Crause    7 年前

    我认为您的正则表达式几乎已完成-以下是我将要做的:

    lines2 = lines.gsub(/[\r\n]+/m, "\n")
    

    在上面的例子中,我将\r和\n放入一个类中(这样一来,它们的出现顺序无关紧要),并添加了“+”限定符(这样“\r\n\r\n\r\n”也将匹配一次,整个内容将替换为“\n”)

        10
  •  4
  •   k1r8r0wn    6 年前

    只是另一个变体:

    lines.delete(" \n")
    
        11
  •  2
  •   Andrew Grimm atk    13 年前

    为什么不以文本模式而不是二进制模式读取文件?

        12
  •  2
  •   Matthew Verstraete Rjev    7 年前
    lines.map(&:strip).join(" ")
    
        13
  •  1
  •   Alain Beauvois    11 年前

    您可以使用以下选项:

    my_string.strip.gsub(/\s+/, ' ')
    
        14
  •  0
  •   Dennis    6 年前
    def dos2unix(input)
      input.each_byte.map { |c| c.chr unless c == 13 }.join
    end
    
    remove_all_the_carriage_returns = dos2unix(some_blob)