【问题标题】:How do I remove carriage returns with Ruby?如何使用 Ruby 删除回车?
【发布时间】:2010-09-22 05:02:24
【问题描述】:

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

我也试过正则表达式 /\xD\xA/m 和 /\x0D\x0A/m 但它们也不匹配。

这是我现在的代码:

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

除了替代方案之外,很高兴知道我做错了什么(以促进我的一些学习)。 :)

【问题讨论】:

    标签: ruby regex


    【解决方案1】:
    def dos2unix(input)
      input.each_byte.map { |c| c.chr unless c == 13 }.join
    end
    
    remove_all_the_carriage_returns = dos2unix(some_blob)
    

    【讨论】:

      【解决方案2】:

      只是另一种变体:

      lines.delete(" \n")
      

      【讨论】:

        【解决方案3】:

        我认为你的正则表达式几乎完成了——这就是我要做的:

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

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

        【讨论】:

          【解决方案4】:
          lines.map(&:strip).join(" ")
          

          【讨论】:

            【解决方案5】:

            如果你使用 Rails,有一个squish 方法

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

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

            【讨论】:

            • 对于非 Rails 用户,它被实现为str.gsub(/[[:space:]]+/, ' ').strip
            【解决方案6】:

            使用String#strip

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

            例如

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

            使用 gsub

            string = string.gsub(/\r/," ")
            string = string.gsub(/\n/," ")
            

            【讨论】:

            • 它不会过滤文本中间的换行符:"line1\n line2".strip #=> "line1\n line2"
            • 如果在each_line 调用中使用,那没关系。
            • 删除所有周围的空格!=删除回车
            【解决方案7】:

            你可以用这个:

            my_string.strip.gsub(/\s+/, ' ')
            

            【讨论】:

            • 和上面this one的答案基本一样。
            【解决方案8】:
            modified_string = string.gsub(/\s+/, ' ').strip
            

            【讨论】:

            • 非常感谢!它节省了我的一天!
            • 这会替换任何空白字符,而不仅仅是 CR/LFs
            【解决方案9】:

            "still the same\n".chomp

            "still the same\n".chomp!

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

            【讨论】:

            • chomp 只会从字符串的末尾删除,似乎问题想要删除所有回车。
            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              当您执行puts lines 时,您会得到什么?这会给你一个线索。

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

              C:\> 复制 con lala.txt
              一种
              文件
              和
              许多
              线条
              ^Z
              
              C:\> irb
              irb(main):001:0> text = File.open('lala.txt').read
              => "一个\n文件\n与\n许多\n行\n"
              irb(main):002:0> bin = File.open('lala.txt', 'rb').read
              => "一个\r\n文件\r\n与\r\n许多\r\n行\r\n"
              irb(主):003:0>
              

              但是从您的问题和代码中,我看到您只需要使用默认修饰符打开文件即可。您不需要任何转换,可以使用较短的File.read

              【讨论】:

              【解决方案12】:

              通常,当我处理剥离 \r 或 \n 时,我会通过执行类似的操作来寻找两者

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

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

              【讨论】:

                【解决方案13】:

                下面的呢?

                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>
                

                【讨论】:

                • 另外,我检查了:“\r\n”!=“\n”。所以看起来原始海报代码是正确的。
                【解决方案14】:
                lines2 = lines.split.join("\n")
                

                【讨论】:

                • 这也会去掉标签和空格,这可能不是用户想要的。
                猜你喜欢
                • 2014-01-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-02-19
                • 1970-01-01
                • 1970-01-01
                • 2013-07-13
                • 2016-05-13
                相关资源
                最近更新 更多