【问题标题】:Split on different newlines在不同的换行符上拆分
【发布时间】:2011-09-26 22:12:41
【问题描述】:

现在我正在对字符串执行split,并假设用户的换行符是\r\n,如下所示:

string.split(/\r\n/)

我想做的是拆分\r\n 或只是\n

那么正则表达式将如何拆分其中任何一个?

【问题讨论】:

    标签: ruby regex split newline


    【解决方案1】:

    你试过/\r?\n/ 吗? ? 使 \r 可选。

    用法示例:http://rubular.com/r/1ZuihD0YfF

    【讨论】:

    • 这是解决错误问题的正确方法。你不应该在你的文本中得到\rs。
    • @AndrewGrimm,你为什么认为用户不应该在他的文本中出现\r
    • 如果行只有 \r 怎么办?
    【解决方案2】:

    Ruby 有 String#each_lineString#lines 方法

    返回一个枚举: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-each_line

    返回一个数组: http://www.ruby-doc.org/core-2.1.2/String.html#method-i-lines

    我没有针对您的场景进行测试,但我敢打赌它会比手动选择换行符更好。

    【讨论】:

    • 这就是我要找的。出于某种原因,它保留了\n\r,我不得不在阵列上使用.map(&:squish)
    • 此方案不适用,因为它不考虑不同的换行符序列:String#lines 默认在输入记录分隔符$/ 上分割(see),即换行符("\n" ) 默认情况下 (see)。但是,无需像 Ruby 那样考虑不同的换行符 (see)。
    【解决方案3】:
    # Split on \r\n or just \n
    string.split( /\r?\n/ )
    

    虽然它对这个问题没有帮助(您确实需要正则表达式),但请注意 String#split 不需要正则表达式参数。您的原始代码也可能是string.split( "\r\n" )

    【讨论】:

      【解决方案4】:
      \n is for unix 
      \r is for mac 
      \r\n is for windows format
      

      为了操作系统的安全。我会做 /\r?\n|\r\n?/

      "1\r2\n3\r\n4\n\n5\r\r6\r\n\r\n7".split(/\r?\n|\r\n?/)
      => ["1", "2", "3", "4", "", "5", "", "6", "", "7"]
      

      【讨论】:

      • 最完整的答案,不明白为什么没有更多的支持。在 mac 文件上,所有其他解决方案都没有进行任何拆分
      【解决方案5】:

      Ruby 中的交替运算符Regexp 与标准正则表达式中的相同:|

      所以,显而易见的解决方案是

      /\r\n|\n/
      

      相同
      /\r?\n/
      

      即可选的\r,后跟强制的\n

      【讨论】:

      • “和一样”?不必要。一般来说,最好尽量避免在正则表达式中使用|,因为这样会降低效率。
      • @NickAldwin:我的意思是语义上的。我认为任何一半体面的编译器都应该能够合并常见的前缀和后缀并将第一种形式变成第二种形式,不是吗?毕竟,Regexp 不是图灵完备的(好吧,Ruby 1.9 实际上可能),因此,与普通编程语言不同,并非每次优化尝试都会自动解决停机问题。跨度>
      【解决方案6】:

      你是从文件中读取,还是从标准输入中读取?

      如果您正在从文件中读取,并且文件处于文本模式,而不是二进制模式,或者您正在从标准输入中读取,则无需处理 \r\n - 它只需看起来像\n

      C:\Documents and Settings\username>irb
      irb(main):001:0> gets
      foo
      => "foo\n"
      

      【讨论】:

      【解决方案7】:

      也许只对 '\n' 进行拆分,如果存在 '\r' 则删除它?

      【讨论】:

        【解决方案8】:

        另一种选择是使用String#chomp,它也可以自己智能地处理换行符。

        您可以通过以下方式完成您的目标:

        lines = string.lines.map(&:chomp)
        

        或者,如果您正在处理的事情足够大,以至于内存使用成为一个问题:

        <string|io>.each_line do |line|
          line.chomp!
          #  do work..
        end
        

        在解决这类问题时,性能并不总是最重要的,但值得注意的是,chomp 解决方案也比使用正则表达式要快一些。

        在我的机器上(i7,ruby 2.1.9):

        Warming up --------------------------------------
                   map/chomp    14.715k i/100ms
          split custom regex    12.383k i/100ms
        Calculating -------------------------------------
                   map/chomp    158.590k (± 4.4%) i/s -    794.610k in   5.020908s
          split custom regex    128.722k (± 5.1%) i/s -    643.916k in   5.016150s
        

        【讨论】:

          猜你喜欢
          • 2018-01-24
          • 1970-01-01
          • 2013-11-18
          • 2016-07-28
          • 2014-08-05
          • 2014-08-31
          • 2010-09-27
          • 1970-01-01
          • 2013-08-30
          相关资源
          最近更新 更多